Est-ce que la parité des marques et des espaces est possible avec boost.asio?

Je ne vois pas comment configurer le port série correctement en utilisant la structure termios, donc je regarde les bibliothèques tierces.

On m’a conseillé d’essayer boost.asio, mais en regardant les exemples, il semble que cela ne supporte pas la parité des espaces et des marques, est-ce vrai?

Si cela est possible, quelqu’un pourrait montrer un exemple de code sur la manière de marquer et d’espacer la parité dans boost.asio. J’utilise 8 bits, 115220 bauds et 1 bit d’arrêt.

Est-ce que quelqu’un connaît des bibliothèques tierces qui prennent en charge la parité mark-and-space sur Linux que je peux utiliser au lieu de booster?

Il y a un très bon article sur ce problème ici .

En particulier

La parité MARK et SPACE, bien qu’implémentée dans la plupart des matériels, n’est pas définie dans le standard POSIX. La page de manuel de la bibliothèque termix Unix / Linux, par exemple, ne perd aucun mot sur ces deux modes de parité. (Notez que PARMRK n’a rien à voir avec la parité MARK.)

C’est pourquoi, je pense, ces options ne sont pas implémentées dans Boost.Asio.

Un certain nombre de solutions sont proposées: Par exemple:

Le mode 8M1 (8 bits de données, parité MARK, 1 bit d’arrêt) peut être émulé avec 8N2. Au lieu d’envoyer un bit de parité et un bit d’arrêt, deux bits d’arrêt sont transmis. Puisque les bits d’arrêt sont toujours 1 (bits de repère), les deux modes sont équivalents.

Si ceux-ci ne correspondent pas à vos besoins, vous pouvez obtenir la représentation native de votre port série dans boost asio. De la documentation:

basic_serial_port::native_handle Get the native serial port representation. native_handle_type native_handle(); This function may be used to obtain the underlying representation of the serial port. This is intended to allow access to native serial port functionality that is not otherwise provided. 

Pour avoir une idée de l’utilisation, jetez un coup d’œil sur

 boost_1_45_0/boost/asio/serial_port_base.hpp 

et en particulier le code à faire avec la parité sur Linux:

 switch (value_) { case none: storage.c_iflag |= IGNPAR; storage.c_cflag &= ~(PARENB | PARODD); break; case even: storage.c_iflag &= ~(IGNPAR | PARMRK); storage.c_iflag |= INPCK; storage.c_cflag |= PARENB; storage.c_cflag &= ~PARODD; break; case odd: storage.c_iflag &= ~(IGNPAR | PARMRK); storage.c_iflag |= INPCK; storage.c_cflag |= (PARENB | PARODD); break; default: break; } 

Je pense que vous voulez utiliser le native_handle pour définir set le drapeau quelque chose comme ça:

 cflag |= PARENB | CMSPAR // To select SPACE parity cflag &= ~PARODD cflag |= PARENB | CMSPAR | PARODD // to select MARK parity 

(selon ici , de toute façon) Voir aussi la mauvaise séquence de données reçues par libserial