Página 1 de 1

UART

MensagemEnviado: 30 Jan 2014 15:57
por knt
Como faço para Transmitir e receber mais de 16 bytes de uma vez através da UART?
se alguém tiver algum exemplo ajudaria muito
estou usando o LPC1768 e RS485
Obrigado

Re: UART

MensagemEnviado: 31 Jan 2014 18:50
por RobL
Como faço para Transmitir e receber mais de 16 bytes de uma vez através da UART?


Me parece que você pensou algo e escreveu o que não pensou. Isso acontece comigo também.
Não tem como receber nada acima de um byte de cada vez (a não ser numa UART especial).

Então como receber uma var de 16, 32 ou mais bits ?
Eles vão ser "quebrados" em bytes. Um ponteiro ordena a chegada, normalmente descrita pelo protocolo utilizado.
Por exemplo, no protocolo ModBus, os dados, o primeiro byte recebido é o Hi, o próximo o Low. Você tem que remontar eles como um int de 16bits e ainda fazer um swap (inverter a ordem) se estiver trabalhando em Little-Endian.
Com o protocolo você sabe quem é quem quando recebe. É uma montagem chata.

Re: UART

MensagemEnviado: 01 Fev 2014 08:43
por xultz
RobL, acho que a dúvida dele é esta mesma. Se não me falha a memória, o LPC tem um buffer de recepção de 16 bytes. Pelo que me lembro, você pode configurar o LPC para gerar interrupção quando receber 1 byte, 8 bytes ou 16 bytes. Usar a interrupção de 16 bytes só é boa se ele vai receber muitos bytes na porrada, em alta velocidade e sem parar. Caso contrário, configure para gerar interrupção quando receber 1 byte só, e assim você vai montando teu pacote a cada byte recebido. Desta forma, teu pacote pode ter muitos bytes.

Re: UART

MensagemEnviado: 01 Fev 2014 09:31
por andre_luis
xultz escreveu:...configure para gerar interrupção quando receber 1 byte só, e assim você vai montando teu pacote a cada byte recebido. Desta forma, teu pacote pode ter muitos bytes.


Pessoalmente, prefiro essa opção aí, onde eu mesmo gerencio o recebimento do pacote, ao invéz de confiar essa tarefa ao sistema.

Por exemplo, quando programava em C++ utilizando a API para o Windows, a comunicação se perdia frequentemente.
Somente depois que fiz a minupulação do recebimento, byte por byte, é que a coisa funcionou normalmente.



+++

Re: UART

MensagemEnviado: 01 Fev 2014 12:07
por RobL
Note que há UARTs que tem um buffer por hardware. Esta que o Xultz colocou, como exemplo. Tem umas que vão até vários kb.
Quando tem esta facilidade, gerar interrupções a cada n bytes é vantajoso. Facilita muito o processamento em vez de ficar interrompendo a cada byte. No entanto, isso não muda a forma de remontar as variáveis com 8, 16, 32, etc bits.

Cabe observar que a transmissão assíncrona, exige que seja transmitido um byte de cada vez, pois com mais de 8 bits, o clock teria que ter uma tremenda precisão. Portanto a UART continuara a receber byte por byte, considerando o start bit e o stop bit, paridade que dá em torno de 10 a 11 bits por "byte".

Portanto para transmitir 16 bytes terá que ter um ponteiro para carregar byte por byte de um buffer para a UART e ter do outro lado o mesmo buffer.