Boa noite amigos do fórum;;; Estou com um probleminha. Preciso receber dados por uma serial via software de um leitor de código serial 9600 8-N-1 e coletar esse numero de 12 digitos e enviar pela serial verdadeira do PIC. Os primeiros 2 digitos aparecem normal... mas a partir do 3 digito começa a sofrer alterações. Exemplo: 78^^{&)(<</;.... etc (780054632126)
Acho que falta um pequeno detalhe, mas não estou achando a solução; Se algum amigo tiver alguma idéia para me ajudar, agradeço desde já.
DANIEL
PIC16F628A
// funçao principal
void main(void){
static char caracter;
int y, x = 0;
init(); //inicializaçao dos ports e perifericos do PIC
// Serial por software
// TX = RB4 e RX = RB5
rs232_inicializa ();
delay_ms(1000);
rs232_transmite ("Serial 2 - Teste OK.\r\n");
printf("Serial 1 - Teste OK...\r\n");
y =0;
while(true){ //faz eternamente
if (!pino_rx) { // Verifica se tem dado a ser recebido
y = recebe(); // Vai receber os 12 caracteres e recebe o numero de carac. lidos em y.
printf("\r\nLeu %d caracteres. ", y);
for (x=0;x<sizeof(numcard)-1;x++){ //escreve msg
printf("%c",numcard[x]);
}
y = 0;
}
if (input(JUMPER)) { //apenas para teste
printf("\r\nLeu %d caracteres. ", y);
for (x=0;x<sizeof(numcard)-1;x++){ //escreve msg
printf("%c",numcard[x]);
}
}
}
}
void init(void){
set_tris_A(0b00000000); //configura pinos do port A como saída,
set_tris_B(0b00101010); //configura pinos do port B como saída,
//exceto RB1, RB3, RB5
//habilita interrupções
enable_interrupts(INT_RDA); //habilita interrupção RS-232 (rec)
enable_interrupts(GLOBAL); //habilita interrupção global
// disable_interrupts(GLOBAL); // desliga todas as interrupçoes
}
ANEXO RS232.C
// Definições de comunicação
/*
Para alterar a velocidade de comunicação, basta alterar o valor da
constante baud_rate
*/
#ifndef baud_rate
const long int baud_rate = 9600;
#endif
const int tempo_bit_dado = 1000000/baud_rate-10; // tempo do bit de dado
const int tempo_bit_start = 1500000/baud_rate; // tempo do bit de start
unsigned char numcard[]={"000000000000"};
// Definições dos pinos de comunicação
// Para utilizar outros pinos, basta incluir novas definições
// no arquivo do programa onde esta biblioteca for incluída
#bit pino_tx = 0x06.4 // pino de transmissão é o RB4
#bit pino_rx = 0x06.5 // pino de recepção é o RB5
#bit dir_tx = 0x86.4 // direção do pino de tx
#bit dir_rx = 0x86.5 // direção do pino de rx
void rs232_inicializa (void)
{
dir_tx = 0; // pino de tx como saída
pino_tx = 1; // coloca o pino de tx em nível 1
dir_rx = 1; // configura o pino de rx como entrada
}
void rs232_transmite (char dado)
{
boolean result;
int conta;
// primeiro o bit de start
pino_tx = 0;
delay_us(tempo_bit_dado); // aguarda o tempo de start
conta = 8; // são 8 bits de dados
while (conta)
{
// desloca o dado à direita e dependendo do resultado
// seta ou não a saída
if (shift_right ( &dado, 1, 0)) pino_tx=1; else pino_tx=0;
delay_us ( tempo_bit_dado); // aguarda o tempo do bit de dado
conta--; // decrementa um no número de bits a transmitir
}
pino_tx = 1; // seta a saída TX (bit de stop)
delay_us(tempo_bit_dado); // aguarda o tempo de 1 bit
}
*********** AQUI DEVE ESTAR O PROBLEMA ****************************************
int recebe(void)
{
int conta,dado;
int z=0;
while (z<=12) { // faça enquanto...
delay_us(tempo_bit_start); // aguarda o tempo de start
conta = 8; // são 8 bits de dados
dado = 0; // apaga o dado recebido
while (conta) {
shift_right( &dado, 1, pino_rx); // insere o bit recebido
// deslocando à direita a variável com o dado recebido
delay_us(tempo_bit_dado); // aguarda o tempo de 1 bit
conta--; // decrementa o número de bits
}
delay_us(tempo_bit_dado); // aguarda o tempo de 1 bit
numcard[z] = dado; //Armazena os caracteres recebidos em numcard
z++;
}
return z; // retorna o numero de caracters recebidos
}
[/b]