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

ioctlyfcntl.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
cfmakerawa unttyobtenido detcgetattr. No puedestruct termiosponer a cero a , configurarlo y luego configurarlottycontcsetattr. 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:
CMSPARsolo 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.hpermite la definición deCMSPARsolo si el símbolo del preprocesador__USE_MISCestá definido. Esa definición ocurre (enfeatures.h) conLos comentarios introductorios de
<features.h>dice:fuente
lsusbpara ver todos los dispositivos USB. Podrían nombrarse de manera diferente si su sistema tieneudevreglas 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
cfmakerawcorrecto?O_NDELAYoO_NONBLOCK. El cmrr.umn.edu/~strupp/serial.html menciona que si abre el descriptor de archivo con esos indicadores, entoncesVTIMEse ignora. Entonces, ¿cuál es la diferencia entre correr conO_NONBLOCKun descriptor de archivo o hacerlo conVTIME?