UART

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

UART

Mensagempor knt » 30 Jan 2014 15:57

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
knt
Bit
 
Mensagens: 25
Registrado em: 25 Mar 2013 14:32

Re: UART

Mensagempor RobL » 31 Jan 2014 18:50

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.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Re: UART

Mensagempor xultz » 01 Fev 2014 08:43

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.
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: UART

Mensagempor andre_luis » 01 Fev 2014 09:31

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.



+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: UART

Mensagempor RobL » 01 Fev 2014 12:07

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.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56


Voltar para ARM

Quem está online

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

x