Question

Je dois envoyer et recevoir des données via des connexions série (RS-232 et RS-422).

Comment puis-je établir et communiquer avec une telle connexion ?Comment puis-je déterminer quels sont les paramètres de configuration (par ex.débit en bauds) devrait être et comment puis-je les définir ?

En particulier, je cherche à le faire en Java, C/C++ ou l'un des principaux shells Unix, mais je m'intéresse également à la programmation série utilisant Windows/Hyperterminal.

Était-ce utile?

La solution

Construire une machine à voyager dans le temps et retourner en 1987 ?Ho ho.

Ok, plus de commentaires sarcastiques.

Comment puis-je déterminer quels sont les paramètres de configuration (par ex.débit en bauds) devrait être...

Lire la fiche technique ?OK OK.Sérieusement, le dernier.Si vous ne connaissez pas le débit en bauds de l'appareil avec lequel vous essayez de communiquer, vous avez deux choix.Commencez à deviner, ou éventuellement sortez un o-scope.Si vous avez besoin d'un bon point de départ, laissez-moi vous suggérer le 9600-8-N-1.Je soupçonne que vous pouvez y arriver relativement rapidement avec la force brute.Il existe une troisième option consistant à avoir un ninja de la vieille école qui peut dire simplement par le REGARD des caractères tronqués à un débit en bauds standard quel est le débit en bauds réel.Une astuce de fête impressionnante, bien sûr.

J'espère que vous avez accès à ces informations.Sous Unix/Linux, vous pouvez vous procurer Minicom pour jouer directement avec le port série.Cela devrait permettre de comprendre assez rapidement la configuration.

l'un des principaux shells Unix

Sous Unix, le ou les ports série sont mappés en fichier dans le sous-répertoire /dev/.ttyS0, par exemple.Si vous configurez le débit en bauds correct et ainsi de suite en utilisant minicom, vous pouvez même transférer des éléments vers ce fichier pour envoyer des éléments là-bas.

Passons au cœur de la question, vous pouvez y accéder par programme via les en-têtes POSIX.termios.h est le plus gros.

Voir: http://www.easysw.com/~mike/serial/serial.html#3_1 (N'EST PLUS DISPONIBLE)

mais j'ai aussi un certain intérêt pour la programmation série utilisant Windows/Hyperterminal.

Hyperterminal et minicom sont fondamentalement le même programme.Quant à la façon dont Windows vous permet d'accéder au port série, je laisserai cette question à quelqu'un d'autre.Je n'ai pas fait ça sous Windows depuis l'époque de Win95.

Autres conseils

Si vous voulez coder en Java, je recommande vraiment SerialIOs Port série.Il est très simple à utiliser et vous fait gagner des journées de travail.Je n'ai jamais trouvé de bibliothèque open source aussi bonne que SerialIO, VRAIMENT !

Mon conseil:n'utilisez pas le framework IO série de Sun !Il date de 1998 et est plein de bugs.Vous pouvez utiliser rxtx mais Serialio c'est mieux !

Pour C/C++ sous Windows, vous avez (au moins) deux choix :

  1. Utilisez la classe SerialPort fournie par .NET.
  2. Utilisez l'API Win32.Il y a un article détaillé sur MSDN datant de 1995, ainsi que de nombreuses bibliothèques et exemples gratuits sur le Web pour vous aider à démarrer.

L'option .NET sera beaucoup plus simple.

S'il doit être multiplateforme, je suggère de regarder Boost Asie.

Au travail, nous utilisons teraterm et realterm pour vérifier que les données série sont correctement formatées.Nous disposons également d'un répartiteur matériel avec un commutateur nous permettant de surveiller le trafic vers notre application via un câble vers un autre port.

Windows vous permet d'accéder au port série via CreateFile.Cela vous donne une poignée et à partir de là, vous pouvez configurer l'accès.

Il y a quelque temps, j'ai écrit une application de taille décente pour acheminer les connexions d'une batterie de modems vers une adresse réseau TCP/IP.

Au départ, je cherchais une bibliothèque Serial IO non encombrée (gratuite).J'ai essayé Sun, IBM et RxTx.Ils étaient parfaits pour développer l'application et lors des tests initiaux, mais en production, ils se sont tous révélés instables.

Finalement, j'ai payé pour le SerialPort de SerialIO.La conversion était littéralement un exercice de modification des importations, et la bibliothèque a été absolument solide comme le roc - je ne saurais trop le recommander.Mon application fonctionne sur le terrain 24h/24 et 7j/7 depuis quelques années maintenant, sans aucun problème rencontré par plusieurs clients.

Si vous commencez le développement en utilisant SerialPort, ils ont une meilleure API et je l'utiliserais.

Si vous avez besoin d'une prise en charge multiplateforme, Java avec SerialPort était le meilleur choix que j'ai pu trouver.

Enfin, leur licence est sacrément raisonnable tant que vous ne préinstallez pas de logiciel sur l'équipement de votre (vos) client (s).

D'un autre côté, si vous souhaitez le faire en utilisant C#, qui fonctionnera à la fois sous Windows et Linux - avec quelques limites (MODIFIER:qui est peut-être obsolète.Je n'ai aucun moyen de le tester.).Créez simplement un Port série objet, définissez son débit en bauds, son port et tout autre paramètre impair, appelez open dessus et écrivez vos octets.Après toute la configuration, l'objet SerialPort agit de manière très similaire à n'importe quel flux en réseau, il devrait donc être assez facile à comprendre.

Et comme le dit ibrandy, vous devez connaître tous ces paramètres, comme le débit en bauds, avant même de commencer à essayer de communiquer avec un périphérique série.

En fonction du périphérique avec lequel vous essayez de communiquer, il peut y avoir d'autres paramètres à prendre en compte que le débit en bauds, le nombre de bits de données, le type de contrôle de parité et le nombre de bits d'arrêt.Si je me souviens bien, les modems utilisent neuf lignes de l'interface RS-232C.Certains appareils, comme par exemple les caisses enregistreuses, peuvent utiliser le handshake matériel sur les lignes RTS/CTS ou sur les lignes DTR/STR.

En général, il est bon de savoir comment fonctionne l'interface.Vous ne pouvez pas communiquer si le débit en bauds ne correspond pas, mais un mauvais réglage d'autres paramètres pourrait fonctionner.Par exemple, vous pouvez facilement envoyer des données à l'appareil en attendant 1 bit d'arrêt avec 2 bits d'arrêt définis.Les problèmes commencent lorsque vous essayez de recevoir des données dans un tel cas.Vous pouvez également utiliser un bit de parité correctement défini comme l'un des bits d'arrêt, etc.

Si vous n'êtes pas obligé d'utiliser un compilateur particulier je vous suggère d'utiliser Qt et dans la nouvelle version 5.3 vous trouverez une classe dédiée aux ports série :

http://qt-project.org/doc/qt-5/qserialport.html

Le code que vous écrirez fonctionnera sur toutes les plates-formes Qt prises en charge, du moins celles dotées de ports série.

J'utilise purejavacomm :C'est une implémentation de javax.comm écrite en java pur + JNA

Contrairement à rxtx, vous n'avez pas besoin d'installer une DLL.Il est écrit en Java pur + JNA, ce qui a résolu pour moi le problème de portabilité entre Windows et Linux.Il devrait être facile de le porter sur d'autres systèmes d'exploitation pris en charge par JNA, tels que Solaris et FreeBSD, mais je ne l'ai pas essayé.

Vous pourriez vous attendre à ce qu'une bibliothèque Java pure soit en retard sur une implémentation native telle que rxtx en termes de performances, mais avec les processeurs modernes, le goulot d'étranglement est très probablement le débit binaire de votre port série, et non les cycles du processeur.De plus, il est beaucoup plus facile à déboguer qu'une bibliothèque mixte Java/Native ou du code natif pur compilé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top