Página 1 de 1

UART1_Read_Text MikroC Pro Pic

MensagemEnviado: 26 Ago 2009 14:50
por SoMeWhErE
Bom dia.

Então, tô usando esse compilador novo, mas ta me dando uma dor de cabeça, gostaria de saber se alguem tá usando e tem alguma dica?

Estou usando um PIC18F452 à 8MHz e Baud Rate 9600.

Código: Selecionar todos
UART1_Read_Text(RecvBuf, 0xF2, 10); // Lê Texto até que ETX seja encontrado


Descrição do HELP
void UART1_Read_Text(char *Output, char *Delimiter, char Attempts);

Reads characters received via UART until the delimiter sequence is detected. The read sequence is stored in the parameter output; delimiter sequence is stored in the parameter delimiter.

This is a blocking call: the delimiter sequence is expected, otherwise the procedure exits (if the delimiter is not found).

Parameters :

Output: received text
Delimiter: sequence of characters that identifies the end of a received string
Attempts: defines number of received characters in which Delimiter sequence is expected. If Attempts is set to 255, this routine will continuously try to detect the Delimiter sequence.

Ele lê o que vem da serial até encontrar 0xF2 ou até receber 10 caracteres, pelo que entendi.

O Comando UART1_Write_Text está funcionando perfeitamente, o problema é com o Read.
Primeiramente meu buffer RecvBuf não está recebendo nada dessa função.
Seguinte, quando envio para o uC 10 caracteres com o 0xF2 no meio, ele não sai fora da função, qdo envio novamente os mesmos 10 caracteres ele sai e o buffer fica vazio.
Qdo envio por exemplo, 2 caracteres entra não função e não sai, dae vou enviando +2, e mais, até qdo completa os 10 caracteres ae sai mas o buffer continua vazio, mesmo colocando nesses 2 caracteres o delimitador.

Exemplo do que está acontecendo, nessa caso o delimitador é "OK", e attemps é 10:
Sent: 1245OK - Enviei e não retornou nada
Sent: 1245OK - Enviei novamente...
Received: 121245 - Ae me retornou isso aqui.

Código: Selecionar todos
if (UART1_Data_Ready() == 1 && Processo == 1)
      {
          UART1_Read_Text(RecvBuf, "OK", 10); // reads text until 'OK' is found
         delay_ms(100);
         UART1_Write_Text(RecvBuf);


alguem tem uma ideia, ou um outro modo sem usar essa função pra receber uma string pela serial.

Obrigado

MensagemEnviado: 26 Ago 2009 15:57
por tcpipchip
Ola
Aqui um exemplo em MIKROC que fiz para ser um painel de mensagens serial...vai te ajudar...foi para o 18F452...
Se tiverem interesse, fiz o mesmo programa em MIKROBASIC e MIKROPASCAL

www.inf.furb.br/~maw/asm51/painel_serial.pbas

T+

TCPIPCHIP

MensagemEnviado: 26 Ago 2009 16:43
por SoMeWhErE
VAlew tcp.....vou dar uma olhada, mas esse link que vc passou eh BASIC, não C.

MensagemEnviado: 26 Ago 2009 17:00
por tcpipchip
Putz...
Desculpe...
Segue a mesma versao em C
http://www.inf.furb.br/~maw/asm51/painel.c

MensagemEnviado: 26 Ago 2009 18:15
por Jorge_Francisco
Só para lembrar que "OK" tem 3 caracteres: 'O'+'K'+'/0'.

Vlw

MensagemEnviado: 26 Ago 2009 22:20
por SoMeWhErE
tcpipchip

amanhã vou dar uma conferida no link. qualquer coisa vou a tirar duvidas...

Jorge_Francisco
valew.....

então, meu uC vai conversar com um leitor biométrico, q o Start dele é um byte 0xF1 e o End é 0xF2.

MensagemEnviado: 27 Ago 2009 09:30
por SoMeWhErE
Então tcp, valew, mas não era bem o q eu procuro...

o seguinte, o leitor que com vai comunicar manda a seguinte string, essa é uma delas:

0xF1 '0' '0' '0' '7' ',' 'O' 'K' ',' 'T' 'B' 'M' '1' '9' '3' 0xF2

0xF1 - Start Transmission
'0''0' - Comando Leitura/Escrita
'0''7' - Comando a ser Executado
'O''K' - Sinalizador de que recebeu o que foi enviado e está respondendo
'T''B''M''1' - Resposta do comando que foi pedido
'9''3' - Checksum
0xF2 - End Transmission

Porém o leitor me envia essa string tudo de uma vez.

VAlewssss

MensagemEnviado: 27 Ago 2009 09:43
por fabim
[quote="SoMeWhErE"]
0xF1 '0' '0' '0' '7' ',' 'O' 'K' ',' 'T' 'B' 'M' '1' '9' '3' 0xF2
VAlewssss[/quote]

somewhere.
Ja pensou na possibilidade de trabalhar com interrupção ?
Tipo imagin the seguinte.

/****************************************************/
short start, capturado;

void interrupt(void){

foi(serial?){

se(capturado=false){
se(dado_da_Serial ==0xf1 | start==true){
start=true;
*ponteiro_dados++= dado_da_Serial;
se(dado_serial == 0xF2){
start=true;////editando, tem que apagar ele na rotina de tratamento
capturado = true;
}}

}

}

fica legal assim, pode montar uma sub rotina desta forma e fica dedicado igual ao da mikroC, só que não tem um while.

MensagemEnviado: 27 Ago 2009 11:00
por SoMeWhErE
fabim

VAlewsss....cara....vou implementar aki.......certeza q dará certo...

ABRAÇUSSSS a todos

MensagemEnviado: 27 Ago 2009 11:36
por SoMeWhErE
Aew fabim

acabei de testar aki.....putz....funcionou perfeitamente.....

mais uma vez, vc ajudando......BRIGADAUM....

valews....tb tcpipchip e Jorge_Francisco

VALEWsssss.....ABRAÇUSSSSSSS