web-dev-qa-db-fra.com

Comment définir un débit en bauds personnalisé sous Linux?

Je souhaite communiquer sur mon port série sous Linux avec un périphérique avec un débit en bauds non standard qui n'est pas défini dans termios.h.

J'ai essayé la méthode "baud rate aliasing" de cet article , mais quand j'exécute mon programme C (je l'ai nommé "testprogram"), Linux dit "testprogram sets custom speed on ttyS0. This is deprecated."

J'ai fait quelques recherches sur Google, et il semble qu'il existe une autre méthode (plus récente?) Pour changer le débit en bauds en une valeur non standard: On http://sourceware.org/ml/libc-help /2009-06/msg00016.html l'auteur dit que le c_flag De struct termios Doit être OU avec BOTHER (=CBAUDEX | B0). Avec cette méthode, les débits en bauds sont définis directement dans les membres c_ispeed Et c_ospeed Du struct termios. Cependant, je ne sais pas comment j'utilise cette méthode dans mon programme C. Comme l'a dit l'auteur, il n'y a pas de BOTHER défini/disponible lorsque j'inclus termios.h, Alors que faut-il faire pour définir le débit en bauds de cette façon?

Comment puis-je définir le débit en bauds sur une valeur non standard sans changer le noyau?

34
Felix

J'ai remarqué la même chose que BOTHER n'était pas défini. Comme l'a dit Jamey Sharp, vous pouvez le trouver dans <asm/termios.h>. Juste un avertissement, je pense que j'ai rencontré des problèmes, y compris à la fois _ et le <termios.h> fichier en même temps.

Mis à part cela, j'ai trouvé avec la glibc que j'ai, cela ne fonctionnait toujours pas parce que tcsetattr de glibc faisait l'ioctl pour la version à l'ancienne de struct termios qui ne fait pas attention au réglage de la vitesse. J'ai pu définir une vitesse personnalisée en faisant manuellement un ioctl avec le nouveau style termios2 struct, qui devrait également être disponible en incluant <asm/termios.h>:

struct termios2 tio;

ioctl(fd, TCGETS2, &tio);
tio.c_cflag &= ~CBAUD;
tio.c_cflag |= BOTHER;
tio.c_ispeed = 12345;
tio.c_ospeed = 12345;
ioctl(fd, TCSETS2, &tio);
22
dougg3

Vous pouvez définir un débit en bauds personnalisé à l'aide de la commande stty sous Linux. Par exemple, pour définir un débit en bauds personnalisé de 567890 sur votre port série/dev/ttyX0, utilisez la commande:

stty -F /dev/ttyX0 567890
17
manav m-n

dougg3 a à peu près cela (je ne peux pas commenter là-bas). La principale chose supplémentaire que vous devez savoir est les en-têtes qui n'entrent pas en conflit mais fournissent les bons prototypes. La réponse est

#include <stropts.h>
#include <asm/termios.h>

Après cela, vous pouvez utiliser le code de dougg3, de préférence avec une vérification d'erreur autour des appels ioctl (). Vous devrez probablement le placer dans un fichier .c séparé pour le reste de votre code de port série qui utilise les termios normaux pour définir d'autres paramètres. Faire des manipulations POSIX d'abord, puis cela pour définir la vitesse personnalisée, fonctionne très bien sur le UART du Raspberry Pi intégré pour obtenir un débit de 250k bauds).

3
RichardAshAudacity

Pour les utilisateurs de Mac (éventuellement aussi pour certains distributions Linux )

stty ospeed 999999

stty ispeed 999999
0
varatis

BOTHER semble disponible auprès de <asm/termios.h> sous Linux. Tirer la définition à partir de là va être extrêmement non portable, mais je suppose que cette API n'est pas portable de toute façon, donc ce n'est probablement pas une grosse perte.

0
Jamey Sharp

Il y a une puce d'E/S série sur le CPU de votre carte mère ( 16650 UART ). Cette puce utilise un port 8 bits comme bus de contrôle et de données, et vous pouvez donc lui envoyer une commande en écrivant sur cette puce via le bus de contrôle et de données.

Habituellement, une application a effectué les étapes suivantes sur le port série

  1. Réglez le débit en bauds, la parité, l'encodage, le contrôle de flux et la longueur de séquence de début/fin pendant le démarrage du programme. Cette configuration peut être effectuée via ioctl sur le périphérique série ou la commande "stty". En fait, la commande stty utilise ioctl sur ce périphérique série.
  2. Écrivez des caractères de données sur le périphérique série et le pilote écrira des caractères de données sur la puce UART via son bus de données 8 bits.

En bref, vous ne pouvez spécifier le débit en bauds que dans la commande STTY, puis toutes les autres options seront conservées par défaut, et cela devrait suffire pour se connecter à des appareils ohter.

0
Houcheng