Estou um pouco confuso sobre ler e gravar em uma porta serial. Eu tenho um dispositivo USB no Linux que usa o driver do conversor de dispositivo serial USB da FTDI. Quando eu o conecto, ele cria: / dev / ttyUSB1.
Eu pensei que seria simples abrir e ler / gravar dele em C. Conheço a taxa de transmissão e as informações de paridade, mas parece que não há um padrão para isso?
Estou faltando alguma coisa ou alguém pode me apontar na direção certa?
c
linux
serial-port
gnychis
fonte
fonte
ioctl
efcntl
.Respostas:
Escrevi isso há muito tempo ( dos anos 1985-1992, com apenas alguns ajustes desde então ), e apenas copio e colo os bits necessários em cada projeto.
Você deve solicitar
cfmakeraw
umtty
obtido detcgetattr
. Você não pode zerar astruct termios
, configurá-lo e depois definirtty
comtcsetattr
. Se você usar o método zero-out, ocorrerá falhas intermitentes inexplicáveis, especialmente nos BSDs e no OS X. "Falhas intermitentes inexplicáveis" incluem pendurarread(3)
.Os valores para a velocidade são
B115200
,B230400
,B9600
,B19200
,B38400
,B57600
,B1200
,B2400
,B4800
, etc. Os valores de paridade são0
(ou seja, sem paridade),PARENB|PARODD
(permitir a paridade e utilizá ímpar),PARENB
(permitir a paridade e utilizá mesmo),PARENB|PARODD|CMSPAR
(marca de paridade), ePARENB|CMSPAR
( paridade espacial)."Bloqueio" define se um
read()
na porta aguarda o número especificado de caracteres para chegar. Definir nenhum bloqueio significa que umread()
retorno, no entanto, muitos caracteres estão disponíveis sem esperar mais, até o limite do buffer.Termo aditivo:
CMSPAR
é necessário apenas para escolher a paridade de marca e espaço, o que é incomum. Para a maioria dos aplicativos, ele pode ser omitido. Meu arquivo de cabeçalho/usr/include/bits/termios.h
permite a definiçãoCMSPAR
somente se o símbolo do pré-processador__USE_MISC
estiver definido. Essa definição ocorre (infeatures.h
) comOs comentários introdutórios de
<features.h>
dizem:fonte
lsusb
para ver todos os dispositivos USB. Eles podem ter nomes diferentes se o seu sistema tiverudev
regras personalizadas ; veja/etc/udev/rules.d/
Talvez de lá você possa escolher a porta que está procurando. Certamente, listando e desconectando a porta, você pode identificar a diferença.Para código de demonstração que esteja em conformidade com o padrão POSIX, conforme descrito em Configurando os modos de terminal corretamente e no Guia de programação serial para sistemas operacionais POSIX , é oferecido o seguinte.
É essencialmente derivado da outra resposta, mas comentários imprecisos e enganosos foram corrigidos.
Para fazer o programa tratar os dados recebidos como códigos ASCII, compile o programa com o símbolo DISPLAY_STRING, por exemplo
Se os dados recebidos são texto ASCII (em vez de dados binários) e você deseja lê-los como linhas terminadas pelo caractere de nova linha, consulte esta resposta para um programa de amostra.
fonte
cfmakeraw
certo?O_NDELAY
ouO_NONBLOCK
. O cmrr.umn.edu/~strupp/serial.html menciona que, se você abrir o descritor de arquivo com esses sinalizadores, eleVTIME
será ignorado. Então, qual é a diferença entre executar comO_NONBLOCK
o descritor de arquivo e fazê-loVTIME
?