Comment faire pour ouvrir, lire, et écrire à partir du port série en C?
Je suis un peu confus au sujet de la lecture et de l'écriture à un port série. J'ai un périphérique USB sous Linux qui utilise le FTDI USB périphérique série convertisseur de pilote. Quand je le branche, il crée: /dev/ttyUSB1.
J'ai pensé itd être simple pour ouvrir et lire/écrire en C. je sais que le débit en bauds de la parité et de l'information, mais il semble qu'il n'y a pas de norme pour ce?
Suis-je raté quelque chose, ou quelqu'un peut me pointer dans la bonne direction?
- Avez-vous pris un coup d'oeil à la la Programmation en Série HOWTO?
- EDIT: je regarderais ribram du lien. Toutefois, le point reste que si un périphérique série est représentée sous forme d'un fichier, les appareils ont souvent plus d'interfaces spécifiques mis en œuvre via des appels système comme
ioctl
etfcntl
. - Mise à jour du lien vers numéro de Série Guide de Programmation POSIX Systèmes d'Exploitation.
- Comprendre UNIX termios VMIN et VTIME est une excellente ressource pour comprendre VTIME et VMIN qui sont utilisées pour gérer les caractéristiques de blocage de la lecture() sur un port série.
- Ne pas utiliser de code de Frerking "de la Programmation en Série HOWTO", comme mentionné dans le premier commentaire. Ils ne sont pas écrits pour être conforme à POSIX, donc les exemples de code ne sont pas transférables et ne peuvent pas fonctionner de manière fiable pour vous.
Vous devez vous connecter pour publier un commentaire.
J'ai écrit cela il y a longtemps (à partir des années 1985 à 1992, avec juste un peu de bricolage depuis), et il suffit de copier et coller les bits nécessaires à chaque projet.
Les valeurs de vitesse sont
B115200
,B230400
,B9600
,B19200
,B38400
,B57600
,B1200
,B2400
,B4800
, etc. Les valeurs de parité sont0
(ce qui signifie pas de parité),PARENB|PARODD
(permettre à la parité et à l'utilisation impair),PARENB
(permettre à la parité et à l'utilisation même),PARENB|PARODD|CMSPAR
(marque de la parité), etPARENB|CMSPAR
(espace de parité)."Blocage" permet de définir si un
read()
sur le port attend pour le nombre spécifié de caractères à arriver. Réglage aucun blocage signifie qu'unread()
renvoie cependant, de nombreux personnages sont disponibles, sans attendre plus, jusqu'à la limite de tampon.Addendum:
CMSPAR
est nécessaire que pour le choix de la marque et de l'espace de parité, ce qui est rare. Pour la plupart des applications, il peut être omis. Mon fichier d'en-tête/usr/include/bits/termios.h
permet de définir desCMSPAR
seulement si le symbole de préprocesseur__USE_MISC
est défini. Cette définition se produit (dansfeatures.h
) avecLes commentaires d'introduction de
<features.h>
dit:lsusb
pour voir tous les périphériques USB. Ils peuvent être nommés différemment si votre système est personnaliséudev
règles; voir/etc/udev/rules.d/
Peut-être de là, vous pouvez choisir le port que vous recherchez. Certainement par l'inscription et de l'onu/brancher le port, vous pouvez identifier la différence.ignore break signal
mais dans le code, il est dit:tty.c_iflag &= ~IGNBRK;
. Si vous voulez ignorer la pause, ne devrais pas le~
- ils être supprimés? Les pages Man de direIGNBRK - ignore BREAK condition on input
.man termios
Ou de la vue/usr/include/bits/termios.h
tty.c_iflag &= ~IGNBRK;
tty.c_lflag = 0;
,tty.c_oflag = 0;
? J'ai regardé les pages de manuel et les commentaires dans le code ci-dessus n'a pas beaucoup de sensc_lflag
etc_oflag
éteindre toutes les "locaux" et de "sortie" des modes. D'avoir cru série i/o, nous ne voulons pas de traduction de retour chariot et saut de ligne à saut de ligne etc.. nous ne voulons pas de traitement de signal (ctrl-C, ctrl-\, etc.), cas de conversion, l'édition de la ligne de l'onglet extension, etc.error_message()
de la fonction et de gérer l'erreur comme souhaitable pour votre application.c_lflag
etc_oflag
s'éteint toutes un tel traitement.Pour la démo de code qui est conforme à la norme POSIX, comme décrit dans Réglage Des Modes De Terminal Server Correctement
et Série Guide de Programmation POSIX Systèmes d'Exploitation, les éléments suivants sont proposés.
C'est essentiellement dérivée de la réponse, mais il est inexact et trompeur commentaires ont été corrigés.
Faire le programme de traiter les données reçues comme des codes ASCII, compiler le programme avec le symbole DISPLAY_STRING, par exemple
cfmakeraw
droit?O_NDELAY
ouO_NONBLOCK
. Le cmrr.umn.edu/~strupp/serial.html mentionne que si vous ouvrez le fichier descripteur avec les drapeaux, puis leVTIME
est ignoré. Alors quelle est la différence entre courir avecO_NONBLOCK
descripteur de fichier rapport de le faire avecVTIME
?