Ajuda com rs232

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Ajuda com rs232

Mensagempor Luiz » 23 Abr 2008 07:26

No Código abaixo:
Como eu vou fazer para a rs232 não tarvar,se não chegar nenhum byte
por um tempo de aproximadamente 500_ms ou se não atingir a quantidade
de bytes de RX ???

Alguem teria algum exemplo prático para postar????

#include <18F2620.h>
#device adc=8

#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOIESO //Internal External Switch Over mode
enabled
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOPUT //No Power Up Timer(Tempo de 72ms)
#FUSES NOSTVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //Low Voltage Programming on B3(PIC16) or
B5(PIC18)
#FUSES NOXINST//Extended CPU (Desabilitar para não dar pane quando aumenta
memoria
#FUSES MCLR //Master Clear pin enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOPBADEN //PORTB pins are configured as analog input
channels on RESET

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

char Recebe[255];
char RX,i,PD;

void main()
{
PD=0;RX=60;

for( i=0; i<=RX; i++){

Recebe[PD]=getc;PD++;//Nenhum byte para aqui !!!
//Se travar(Mensagem de erro)
}

}
Luiz
Bit
 
Mensagens: 32
Registrado em: 20 Nov 2006 07:59

Mensagempor ze » 23 Abr 2008 07:41

um timeout que sugeri pra alguém num outro forum:

Código: Selecionar todos
unsigned char recebebyte()
{
unsigned int tmout=0xffff;
RCIF=0; //precisa ser zerado por sw - acho que o kbhit deve usar isso.
while((!RCIF) && (tmout--));
if (tmout==0) return 0; //0= a serial empacou!!
return RCREG; //USART Receive data register. cá está ele!
}

num dá 500ms e sim uma luz.
abrç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Luiz » 24 Abr 2008 20:16

:cry: :cry: Ainda não consegui !!!!!!!!





Luiz.
Luiz
Bit
 
Mensagens: 32
Registrado em: 20 Nov 2006 07:59

Mensagempor tcpipchip » 25 Abr 2008 23:22

#use RS232 (BAUD=19200,XMIT=PIN_C6,RCV=PIN_C7,RESTART_WDT,PARITY=N,BITS=8)

short timeout_error;


#bit cren = 0x18.4 // Continuous recive bit
#bit oerr = 0x18.1 // Overrun Error bit
#bit adden = 0x18.3


char timed_getc() {

long timeout;

unsigned char car_temp;

timeout_error=FALSE;

timeout=0;

while(!kbhit()&&(++timeout<6250))
{
delay_us(10);
}

if(kbhit())
{
car_temp=getc();
if(oerr)
{
cren=0;
cren=1;
adden=1;
}
return(car_temp);
}

else {

timeout_error=TRUE;

return(0);

}
}

Eu uso e funciona muito bem!

Aproveitando, quem quiser, esta eh a rotina de CRC que uso para comunicacao de dados

/* (Extracted from a document edited by Chuck Forsberg of
* Omen Technology in Portland, Oregon)
*
* This function calculates the CRC used by the XMODEM/CRC Protocol
* The first argument is a pointer to the message block.
* The second argument is the number of bytes in the message block.
* The function returns an integer which contains the CRC.
* The low order 16 bits are the coefficients of the CRC.
*/

unsigned long calcrc(unsigned char *ptr, unsigned char count)
{
unsigned long crc,temporario;

crc = 0;

for(k=1;k<=count;k++)
{
temporario=*ptr++ * 0x100;

crc = (crc ^ temporario);

for (l = 0; l <=7;l++)
{
if (crc & 0x8000)
{
crc = (( crc * 2) ^ 0x1021);
}
else
{
crc = ( crc * 2);
}

crc = crc & 0xFFFF;
}
}
return (crc & 0xFFFF);
}
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x