Je suis un peu confus sur la lecture et l'écriture sur un port série. J'ai un périphérique USB sous Linux qui utilise le pilote de convertisseur de périphérique série USB FTDI. Lorsque je le branche, il crée: / dev / ttyUSB1.
Je pensais qu'il serait simple d'ouvrir et de lire / écrire à partir de celui-ci en C. Je connais le débit en bauds et les informations de parité, mais il semble qu'il n'y ait pas de norme pour cela?
Est-ce que je rate quelque chose ou quelqu'un peut-il m'indiquer la bonne direction?
c
linux
serial-port
gnychis
la source
la source
ioctl
etfcntl
.Réponses:
J'ai écrit ceci il y a longtemps ( des années 1985-1992, avec juste quelques modifications depuis ), et il suffit de copier et coller les éléments nécessaires dans chaque projet.
Vous devez faire appel
cfmakeraw
à untty
obtenu detcgetattr
. Vous ne pouvez pas mettre à zéro unstruct termios
, le configurer, puis définir letty
avectcsetattr
. Si vous utilisez la méthode zéro-out, vous rencontrerez des pannes intermittentes inexpliquées, en particulier sur les BSD et OS X. Les «pannes intermittentes inexpliquées» incluent la suspensionread(3)
.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
(activer la parité et l' utilisation impair),PARENB
(activer la parité et l' utilisation même),PARENB|PARODD|CMSPAR
(parité de marque) etPARENB|CMSPAR
( parité spatiale)."Blocking" définit si un
read()
sur le port attend que le nombre spécifié de caractères arrive. La définition de l' absence de blocage signifie que aread()
renvoie le nombre de caractères disponibles sans attendre davantage, jusqu'à la limite de la mémoire tampon.Addenda:
CMSPAR
n'est nécessaire que pour choisir la parité entre les marques et les espaces, 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éfinirCMSPAR
uniquement si le symbole du préprocesseur__USE_MISC
est défini. Cette définition se produit (dansfeatures.h
) avecLes commentaires introductifs de
<features.h>
dit:la source
lsusb
pour voir tous les périphériques USB. Ils peuvent être nommés différemment si votre système dispose deudev
règles personnalisées ; voir/etc/udev/rules.d/
Peut - être qu'à partir de là, vous pourrez choisir le port que vous recherchez. Certes, en listant puis en débranchant le port, vous pouvez identifier la différence.Pour le code de démonstration conforme à la norme POSIX, comme décrit dans la section Configuration correcte des modes de terminal et Guide de programmation série pour les systèmes d'exploitation POSIX , les éléments suivants sont proposés.
Ce code doit s'exécuter correctement en utilisant Linux sur x86 ainsi que des processeurs ARM (ou même CRIS).
Il est essentiellement dérivé de l'autre réponse, mais les commentaires inexacts et trompeurs ont été corrigés.
Ce programme de démonstration ouvre et initialise un terminal série à 115 200 bauds pour un mode non canonique aussi portable que possible.
Le programme transmet une chaîne de texte codée en dur à l'autre terminal et retarde l'exécution de la sortie.
Le programme entre alors dans une boucle infinie pour recevoir et afficher les données du terminal série.
Par défaut, les données reçues sont affichées sous forme de valeurs d'octets hexadécimaux.
Pour que le programme traite les données reçues comme des codes ASCII, compilez le programme avec le symbole DISPLAY_STRING, par exemple
Si les données reçues sont du texte ASCII (plutôt que des données binaires) et que vous souhaitez les lire sous forme de lignes terminées par le caractère de nouvelle ligne, consultez cette réponse pour un exemple de programme.
la source
cfmakeraw
?O_NDELAY
ouO_NONBLOCK
. Le cmrr.umn.edu/~strupp/serial.html mentionne que si vous ouvrez le descripteur de fichier avec ces indicateurs, alors leVTIME
est ignoré. Alors quelle est la différence entre exécuter avecO_NONBLOCK
un descripteur de fichier et le faire avecVTIME
?