Estoy un poco confundido acerca de leer y escribir en un puerto serie. Tengo un dispositivo USB en Linux que utiliza el controlador del convertidor de dispositivo serie USB FTDI. Cuando lo conecto, crea: / dev / ttyUSB1.
Pensé que sería sencillo abrirlo y leerlo / escribirlo en C. Conozco la velocidad de transmisión y la información de paridad, pero parece que no hay un estándar para esto.
¿Me estoy perdiendo algo o alguien puede señalarme en la dirección correcta?
c
linux
serial-port
gnychis
fuente
fuente
ioctl
yfcntl
.Respuestas:
Escribí esto hace mucho tiempo ( desde los años 1985-1992, con solo algunos ajustes desde entonces ), y solo copie y pegue los bits necesarios en cada proyecto.
Debe llamar
cfmakeraw
a untty
obtenido detcgetattr
. No puedestruct termios
poner a cero a , configurarlo y luego configurarlotty
contcsetattr
. Si utiliza el método de cero, experimentará fallas intermitentes inexplicables, especialmente en los BSD y OS X. Las "fallas intermitentes inexplicables" incluyen el bloqueoread(3)
.Los valores de la velocidad son
B115200
,B230400
,B9600
,B19200
,B38400
,B57600
,B1200
,B2400
,B4800
, etc. Los valores de paridad están0
(lo que significa sin paridad),PARENB|PARODD
(habilitar la paridad y el uso impar),PARENB
(habilitar paridad y usar incluso),PARENB|PARODD|CMSPAR
(paridad marca), yPARENB|CMSPAR
( paridad espacial)."Bloquear" establece si un
read()
en el puerto espera a que llegue el número especificado de caracteres. Si no se configura el bloqueo , seread()
devuelve una cantidad de caracteres disponibles sin esperar más, hasta el límite del búfer.Apéndice:
CMSPAR
solo es necesario para elegir la paridad de marca y espacio, lo cual es poco común. Para la mayoría de las aplicaciones, se puede omitir. Mi archivo de encabezado/usr/include/bits/termios.h
permite la definición deCMSPAR
solo si el símbolo del preprocesador__USE_MISC
está definido. Esa definición ocurre (enfeatures.h
) conLos comentarios introductorios de
<features.h>
dice:fuente
lsusb
para ver todos los dispositivos USB. Podrían nombrarse de manera diferente si su sistema tieneudev
reglas personalizadas ; vea/etc/udev/rules.d/
Quizás desde allí puede elegir el puerto que está buscando. Ciertamente, al enumerar y luego desenchufar / enchufar el puerto puede identificar la diferencia.Para el código de demostración que se ajusta al estándar POSIX como se describe en Configuración adecuada de los modos de terminal y la Guía de programación en serie para sistemas operativos POSIX , se ofrece lo siguiente.
Se deriva esencialmente de la otra respuesta, pero se han corregido los comentarios inexactos y engañosos.
Para que el programa trate los datos recibidos como códigos ASCII, compile el programa con el símbolo DISPLAY_STRING, p. Ej.
Si los datos recibidos son texto ASCII (en lugar de datos binarios) y desea leerlos como líneas terminadas por el carácter de nueva línea, consulte esta respuesta para un programa de muestra.
fuente
cfmakeraw
correcto?O_NDELAY
oO_NONBLOCK
. El cmrr.umn.edu/~strupp/serial.html menciona que si abre el descriptor de archivo con esos indicadores, entoncesVTIME
se ignora. Entonces, ¿cuál es la diferencia entre correr conO_NONBLOCK
un descriptor de archivo o hacerlo conVTIME
?