12
votes

Est-il possible d'utiliser une communication série à 9 bits sous Linux?

La communication RS-232 utilise parfois des octets de 9 bits. Ceci peut être utilisé pour communiquer avec plusieurs microcontrôleurs sur un bus où 8 bits sont des données et le bit supplémentaire indique un octet d'adresse (plutôt que des données). Les contrôleurs inactifs ne génèrent qu'une interruption pour les octets d'adresses.

Un programme Linux peut-il envoyer et recevoir des octets de 9 bits sur un périphérique série? Comment?


7 commentaires

Êtes-vous sûr que le 9ème bit n'est pas juste une parité un peu? Je n'ai jamais vu que 7 ou 8 bits de données + Bit de parité optionnelle + 1, 1,5 ou 2 bits d'arrêt.


@Paul R - Les paramètres de 9 bits sont rares, mais (au moins l'habitude d'être) pris en charge. en.wikipedia.org/wiki/serial_port#data_bits


Pouvez-vous vous adonner à ceux qui sont probablement curieux de savoir ce que vous avez qui veut un réglage de 9 bits?


@ Tim Post: Juste une suppose, mais quelque 8051 microcontrôleurs ont un port série amélioré qui utilise le 9e bit sous forme de marqueur de champ d'adresse pour éviter de générer des interruptions sur des messages destinés à un nœud différent.


@Amardeep - Donc, le 8'tth bit reste le bit d'arrêt?


@Tim Post: Le cadre est composé d'un bit de départ suivi de 9 bits de données suivi d'un bit d'arrêt. Les bits de données sont numérotés D0 à D8.


L'OP veut certainement certainement un véritable bits de 9 data, plus des bits d'arrêt et une parité. Il ressemble à un EN.Wikipedia.org/wiki/Multidrop_bus


6 Réponses :


5
votes

Le système TERMIOS ne prend pas directement en charge le fonctionnement de 9 bits, mais il peut être émulé sur certains systèmes en jouant des tours avec le drapeau CMSPar. Il est sans papiers et je ne sais pas dans toutes les implémentations.

Voici un lien vers une émission détaillée sur la manière dont l'émulation de 9 bits est effectuée:

http://www.lothosoft.ch/thomas/libmip/markspacePaceParity.php < / a>


1 commentaires

Utilisez le UART de PC avec 9 -Bit protocoles a une écriture et des allusions moins détaillées et que les données recevez 9 bits peuvent être possibles en inspectant et en nettoyant le bit "Erreur de parité".



1
votes

Un programme Linux peut-il envoyer et recevoir des octets de 9 bits sur un périphérique série?

Le matériel UART standard (8251, etc.) ne prend pas en charge les modes de données de 9 bits.


3 commentaires

La plupart des UARTS ont uniquement des registres de données (et d'état) de 8 bits, il n'est donc pas évident que vous n'enverriez pas / recevoir des données de 9 bits - peut-être qu'il faudrait deux lectures de 8 bits / écrit par octets de 9 bits?


@Paul R - Amardep peut vous suggérer de le faire en basculant manuellement les réglages d'arrêt et / ou de parité avant de transmettre chaque octet; Mais cela ne ferait pas la réception de données de 9 bits.


Un uart 8250/16450/16550 doit être trompé dans la transmission du 9e bit de données en utilisant la marque et la parité spatiale. Vous ne pouvez pas basculer manuellement démarrer et arrêter les bits. Recevoir peut être fait en utilisant la détection d'erreur de parité.



3
votes

Les données de 9 bits sont une partie standard de RS-485 et utilisée dans les applications multidrop. Matériel basé sur les périphériques 16C950 May Support 9 bits, mais uniquement si le UART est utilisé dans son mode 950 (plutôt que les modes 450/550 les plus courants utilisés pour RS-232).

Description du 16C950 peut être trouvée ici .

Cette page résume le support Linux RS-485, qui est cuit à noyaux plus récents (> = 3.2 RC3).


0 commentaires

3
votes

Un cadrage de données à 9 bits est possible même si un monde réel ne le fait pas. Trouvé une bibliothèque qui le fait également sous Windows et Linux. Voir http://adontec.com/9-bit-Serial-communication.htm


0 commentaires

2
votes

essentiellement ce qu'il veut est de données de sortie d'une boîte de linux, puis envoyez-le sur ce de laisser dire un bus 2 fils avec un tas de MAX232 de ic -> certains microcontrôleur avec UART ou logiciel implémentation rs232

on peut laisser l'individu convertisseur de niveau MAX232 est loin tant qu'il n'y a pas de problèmes de Potence de tension entre les micro-contrôleurs individuels (sur le même pcb, par exemple, plutôt que dans des bâtiments différents;) jusqu'à la charge de sortie maximale (ttl) du MAX232 (ou clones, ou une résistance et convertisseur de fréquence / transistor) ic. p>

ne peut pas trouver linux paramètres termios pour MARK ou parité SPACE (je suis sûr que les UART matérielles font réellement un soutien, mais pas la mise en œuvre de TTY linux), donc nous est juste hackzor la génération de parité réelle d'un bit. p>

8 bits de données, 2 bits d'arrêt est la même longueur que 8 bits de données, 1 bit de parité, 1 bit d'arrêt. (Où le premier bit d'arrêt est un 1 logique, la tension de ligne négative). P>

on peut ensuite utiliser le bit 9 comme un indicateur que les 8 autres bits sont l'adresse de la personne ou un groupe de microcontrôleurs, qui ensuite prendre les octets suivants comme une sorte de commande ou de données, ainsi, ils sont « adresse ». p>

prévoit un transparant 8 bits, bien qu'un trafic moyen, les moyens de traiter « beaucoup de choses '(256 différents (groupes de) choses, en fait;) sur le même bus. il est une façon, quand on voudrait faire 2 façon, vous auriez besoin de 2 paires de fils, ou modulent à des fréquences multiples, ou mettre en œuvre la détection de colission et le tout cela. p>

micro-contrôleurs PIC peut faire 9 bit communication série avec EHM « ruser » (le 9 bit est en fait dans un autre registre;) p>

... compte tenu du fait que sur linux et aime ce n'est pas -that- simple, .. . p>

avez-vous pensé tournant simplement la parité sur le « mot d'adresse » (celui dans lequel vous avez besoin 9 bits;) puis à étrange réglage soit ou même, calculer de telle sorte que le droit est choisi de rendre la neuvième (parité) bit « 1 » avec la parité sur 8 bits et « données », puis revenir en arrière hors de parité et tourner à 2 bits d'arrêt sur. (Qui conserve encore une longueur de mot 9 bits dans la mesure où votre micro-contrôleur concerné;) ... il est depuis longtemps, mais aussi loin que je me rappelle bits d'arrêt sont tout aussi longtemps que les bits de données dans le temps des choses p>

cela devrait fonctionner sur tout ce qui peut faire 8 bits en sortie, avec la parité, et avec 2 bits d'arrêt. qui comprend du matériel PC et Linux. (Et dos etc) p>

matériel PC a également des options juste tourner la « parité » ou non pour tous les mots (sans réellement le calculer) si je me souviens bien de « retour dans les jours » p>

Par ailleurs, le 9 mordit la fiche pic parle, est en fait le bit de parité comme RS-232 spécifications. juste que vous êtes libre de désactiver ou. (Le PIC de toute façon - dans linux il est un peu plus compliqué que ça) p>

(rien quelques paramètres termios sur linux ne résoudra pas ... je pense simplement allumer et éteindre puis ... nous « ai fait ce genre de choses faire des choses plus étranges;) p>

un microcontrôleur pic ne fait exactement la même chose, juste que ce n'est pas présenté comme « ce qu'il est en réalité » dans la fiche technique. ils appellent réellement « le bit 9 » et des choses comme ça. sur PC et donc sur linux il fonctionne à peu près de la même manière tho. p>

de toute façon, si cette chose devrait fonctionner « dans les deux sens » alors bon câblage de chance avec 2 paires ou de déterminer une façon de faire la détection de collission, qui est l'enfer beaucoup plus difficile que d'obtenir 9 bits sur. p>

de toute façon, il n'y a pas beaucoup plus d'un registre à décalage surfaite. si l'UART sur le PC ne veut pas le faire (ce dont je doute), tout abus de la broche DTR pour déplacer simplement les données à la main, ou abuser du port d'imprimante pour faire la même chose, ou brancher un registre à décalage le port imprimante ... mais avec l'astuce de la parité, il devrait fonctionner correctement de toute façon. p>

   #include<termios.h>
   #include<stdio.h>
   #include<sys/types.h>
   #include<sys/stat.h>
   #include<fcntl.h>
   #include<unistd.h>
   #include<stdint.h>
   #include<string.h>
   #include<stdlib.h>

   struct termios com1pr;
   int com1fd;

   void bit9oneven(int fd){
   cfmakeraw(&com1pr);
   com1pr.c_iflag=IGNPAR;
   com1pr.c_cflag=CS8|CREAD|CLOCAL|PARENB;
   cfsetispeed(&com1pr,B300);
   cfsetospeed(&com1pr,B300);
   tcsetattr(fd,TCSANOW,&com1pr);
   };//bit9even

   void bit9onodd(int fd){
   cfmakeraw(&com1pr);
   com1pr.c_iflag=IGNPAR;
   com1pr.c_cflag=CS8|CREAD|CLOCAL|PARENB|PARODD;
   cfsetispeed(&com1pr,B300);
   cfsetospeed(&com1pr,B300);
   tcsetattr(fd,TCSANOW,&com1pr);
   };//bit9odd

   void bit9off(int fd){
   cfmakeraw(&com1pr);
   com1pr.c_iflag=IGNPAR;
   com1pr.c_cflag=CS8|CREAD|CLOCAL|CSTOPB;
   cfsetispeed(&com1pr,B300);
   cfsetospeed(&com1pr,B300);
   tcsetattr(fd,TCSANOW,&com1pr);
   };//bit9off

   void initrs232(){
   com1fd=open("/dev/ttyUSB0",O_RDWR|O_SYNC|O_NOCTTY);
   if(com1fd>=0){
   tcflush(com1fd,TCIOFLUSH);
   }else{printf("FAILED TO INITIALIZE\n");exit(1);};
   };//initrs232

   void sendaddress(unsigned char x){
   unsigned char n;
   unsigned char t=0;
   for(n=0;n<8;n++)if(x&2^n)t++;
   if(t&1)bit9oneven(com1fd);
   if(!(t&1))bit9onodd(com1fd);
   write(com1fd,&x,1);
   };

   void main(){

   unsigned char datatosend=0x00; //bogus data byte to send
   initrs232();
   while(1){
   bit9oneven(com1fd);
   while(1)write(com1fd,&datatosend,1);
   //sendaddress(223); // address microcontroller at address 223;
   //write(com1fd,&datatosend,1); // send an a
   //sendaddress(128); // address microcontroller at address 128;
   //write(com1fd,&datatosend,1); //send an a
   }
   //close(com1fd);
   };


1 commentaires

recevoir ... est un peu ... différent. mais l'opération duplex va être une douleur quand même ... (matérielle sage) .. Pour recevoir également avec Linux, vous pouvez vous limiter aux adresses MCU que la parité RS232 ne serait pas une logique 1, car Linux semble avoir aucun moyen de lire le Bit de parité, seulement pour indiquer qu'il ne correspondait pas au paramètre sélectionné) et le premier stopbit est également 1 ... mais vous perdez 128 des adresses possibles. (Vous conservez la transparence des données de 8 bits Tho - et peut toujours avoir la communication avec 128 MCU sur le bus ...



1
votes

J'ai également fait une démonstration complète pour l'émulation de UART à 9 bits (basée sur une parité pair / impaire). Vous pouvez le trouver ici .

Toutes les sources disponibles sur Git .

Vous pouvez facilement l'adapter à votre appareil. J'espère que vous aimez.


0 commentaires