Comment définir le débit en bauds à 307200 sur Linux?
Fondamentalement, je suis en utilisant le code suivant pour définir le débit en bauds du port série:
struct termios options;
tcgetattr(fd, &options);
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
tcsetattr(fd, TCSANOW, &options);
Cela fonctionne très bien. Mais je sais que je dois communiquer avec un périphérique qui utilise un débit en bauds de 307200. Comment puis-je régler ça? cfsetispeed(&options, B307200);
ne fonctionne pas, il n'y a pas de B307200
défini.
Je l'ai essayé à l'aide d'un MOXA Uport 1150 (qui est en fait une clé USB-to-serial converter) et le port série standard d'une carte mère Intel. Je ne sais pas exactement le type de cette dernière, setserial juste le signale comme 16550A.
Pouvez-vous définir ce taux avec "stty'? Si pas, je doute que vous le pouvez (qui semble être une obscure de la vitesse à moi), si vous le pouvez, alors jetez un oeil à cette partie du code. Le "speed_t' options sont définies par une valeur octale dans termios.h de sorte que vous pourriez tirer de la valeur correcte, par l'analyse de ces valeurs.
Pas de
Êtes-vous vraiment bien sûr de la vitesse de transmission de votre appareil est 307200? N'est-ce pas quelque chose de spécifique à la radio de communication?
Yep je suis vraiment sûr, 307200 est correct.
Pas de
stty
ne fonctionne pas car il vérifie le débit en bauds avec certaines valeurs codées en dur. Il est intéressant de noter serserial
permet de définir 307200 et de ne pas signaler une erreur. Mais lorsque je tente de lire à partir du port série, il ne fonctionne pas.Êtes-vous vraiment bien sûr de la vitesse de transmission de votre appareil est 307200? N'est-ce pas quelque chose de spécifique à la radio de communication?
Yep je suis vraiment sûr, 307200 est correct.
OriginalL'auteur cairol | 2011-02-11
Vous devez vous connecter pour publier un commentaire.
Linux utilise un sale méthode non-standard taux de transmission, appelé "débit en bauds de l'aliasing". En gros, vous dites au pilote de série pour interpréter la valeur
B38400
différemment. Ceci est contrôlé avec laASYNC_SPD_CUST
drapeau dansserial_struct
membreflags
.Vous avez besoin de calculer manuellement le diviseur de la vitesse personnalisée comme suit:
Bien sûr, vous avez besoin d'un pilote de série avec adapté
baud_base
et diviseur paramètres. Le précédent extrait de permet de 2% d'écart, ce qui devrait être ok pour la plupart des besoins.Et d'indiquer au pilote d'interpréter
B38400
comme 38400 bauds nouveau:Comme un mot de prudence: je ne sais pas si cette méthode est portable entre autres *nix saveurs.
OMG. C'est juste ... horrible, vraiment. 🙁 Quelqu'un de complètement oublié d'avoir leur abstraction des paillettes sur leurs céréales de petit déjeuner avant la conception de l'API.
Encore plus horrible que vous le pensez, car il est mal documenté. Je suppose que c'est pourquoi cette réponse à partir de 3 ans reçoit encore jusqu'votes 🙂
Ce n'est pas pris en charge pour tous les jetons. Pour le Prolific PL2303, le pilote ne prend pas en charge la
TIOCSSERIAL
ioctl
de commande. J'ai été en mesure de régler la vitesse de transmission directement (à l'aide deB921600
dans mon cas).Vous devez utiliser
struct termios2
dans Linux, et correspondant Ioctl.OriginalL'auteur cyco130
De soutien pour que la vitesse est dépendante du système. Si
B307200
n'est pas défini, alors votre système ne prend pas en charge.Voici le code source pour stty.c: http://www.koders.com/c/fid35874B30FDEAFEE83FAD9EA9A59F983C08B714D7.aspx
Vous pouvez voir que l'ensemble de la haute-vitesse variables sont des #ifdef avais, parce que le soutien pour ces vitesses varie en fonction du système.
/usr/include/bits/termios.h
où les autresBxy
sont.OriginalL'auteur payne
USB de Négociation a un problème similaire. J'ai trouvé cette réponse pour vous qui peut être utilisé ainsi:
OriginalL'auteur Bruce Chidester
Sur de nombreux Systèmes d'exploitation, les valeurs énumérées sont numériquement égale à la vitesse en bauds.
Donc, sautez simplement la macro/dénombrement et de passer à la vitesse en bauds vous voulez, par exempleDe sûr, vous devriez vérifier le code de retour pour s'assurer que ce truc a effectivement travaillé, en outre, pas toutes les vitesses de transmission sont pris en charge par tous les Uart.Vous pouvez également essayer les options de struct serial_struct à l'aide de la
TIOCGSERIAL
etTIOCSSERIAL
codes ioctl.Comme payne dit cela ne fonctionne pas sur Linux.
cfsetispeed
s'attend à une valeur octale. J'ai essayé avec0000022
qui devrait être 307200, mais il ne fonctionne pas.0000022
=18
, Je ne vois pas comment cela "devrait être 307200".Vous avez raison, il devrait être 0000024. Mais c'est juste une hypothèse, car 9600 est défini comme 0000015, 19200 comme 0000016 et 38400 comme 0000017.
J'ai posté quelques informations supplémentaires. Détails sur
TIOCSSERIAL
sont difficiles à trouver, vous aurez probablement à lire la source, mais vous pouvez obtenir des non-standard taux de transmission de cette façon.OriginalL'auteur Ben Voigt
Je l'ai accompli à l'aide de
termios2
etioctl()
commandes.Après cela, vous devriez être en mesure d'interroger les paramètres de port et de voir votre personnalisé de la vitesse de transmission, ainsi que les autres paramètres (possible avec
stty
commandes).Je n'ai pas physiquement mesurer la vitesse en BAUDS, mais je suis en utilisant une mesure de micro-contrôleur qui est en cours d'exécution à une coutume débit en BAUDS et n'ont pas tout l'air d'être des problèmes de communication. Assurez-vous de suivre toutes les étapes ci-dessus pour permettre une coutume débit en BAUDS.
OriginalL'auteur Chef Pharaoh
Essayer l'appel ioctl - vous pouvez spécifier un arbitraire de la vitesse en bauds. C'est,
ioctl(serialFileDescriptor, IOSSIOSPEED, &baudRate);
Pour ouvrir le port série:
À lire à partir du port série:
À écrire sur le port série:
De la liste disponible ports série:
TIOCSSERIAL
qui pourrait être utile et digne d'un upvote.OriginalL'auteur Bruce Chidester