Página 1 de 1

Recebe na serial por soft. e envia na outra serial?

MensagemEnviado: 29 Mar 2010 18:52
por droson
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]

MensagemEnviado: 29 Mar 2010 20:22
por vtrx
Se minha pergunta não for idiota,porque voce recebe por Soft no Pic e depois envia ao PC?
O certo não seria enviar direto do leitor ao PC?Oque po Pic pode fazer com esses dados?
A menos que voce não seja programador tambem de sistemas operacionais não vejo vantagem nesse 'elo'.

MensagemEnviado: 29 Mar 2010 20:49
por droson
Ola amigo, de maneira nenhuma...

Porque tenho que desenvolver uma placa com entrada para dois leitores tipo serial e ao receber o codigo de cada leitor vou enviar ao PC diferenciando de qual leitor veio.
OBS: A saída serial desta placa esta ligada a um conversor serial/TCP-IP que envia ao micro via rede onde esta instalado o software de controle desenvolvido por mim.

MensagemEnviado: 03 Mai 2010 14:42
por bomber-eng
Caro amigo estou querendo a mesma coisa, só que uma serial estarei conversando com o PC e a outra serial estarei enviando e recebendo dados de outro PIC, ou melhor outro hardware. Uma estaria usando por hardware e outra por software.
Conseguiu fazer funcionar o que queria corretamente?

Grato.....

MensagemEnviado: 06 Mai 2010 08:56
por droson
Consegui amigo... Depois de muitos dias pesquisando e tentando, gravando... Acho que gravei mais de 30 vezes o código até conseguir.
O programa esta em C e fiz 2 seriais por soft fora a original do PIC 16F628A.
Todas estão trabalhando com 9.600 8 N 1

Caso queira o fonte, me manda seu email. Não vou postar o código aqui, porque em 2 forum´s que pedi esta ajuda, ninguem respondeu.

MensagemEnviado: 21 Out 2010 06:04
por Mersin
Olá droson,

Tem como vc me enviar o arquivo fonte?

Meu e-mail é: ealvessilva@hotmail.com

Tenho que fazer também o recebimento via software e estou tendo problemas também!

Muito obrigado, agradeço desde já!

Mersin