En gros, ce qu'il veut, c'est sortir des données d'une boîte linux, puis les envoyer sur, disons, un bus à 2 fils avec un tas d'ic's max232 -> un microcontrôleur avec uart ou une implémentation rs232 logicielle.
on peut laisser de côté les convertisseurs de niveau max232 individuels tant qu'il n'y a pas de problèmes de tension entre les microcontrô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 des clones, ou une résistance et un inverseur/transistor).
je ne trouve pas de paramètres linux termios pour la parité MARK ou SPACE (que je suis sûr que les uarts hardware supportent, mais pas l'implémentation linux tty), donc nous allons juste hacker un peu la génération de parité actuelle.
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, tension de ligne négative).
on utilise alors le 9ème bit comme indicateur que les 8 autres bits sont l'adresse de l'individu ou du groupe de microcontrôleurs, qui prennent alors les octets suivants comme une sorte de commande, ou de données, également, ils sont "adressés".
cela permet un trafic transparent de 8 bits, bien qu'unidirectionnel, pour adresser "beaucoup de choses" (256 différents (groupes de) choses, en fait ;) sur le même bus. c'est unidirectionnel, car quand on veut faire du bidirectionnel, il faut deux paires de fils, ou moduler à plusieurs fréquences, ou implémenter la détection de colission et tout le reste.
Les microcontrôleurs PIC peuvent faire de la communication série sur 9 bits avec ehm 'un peu d'astuce' (le 9ème bit est en fait dans un autre registre ;)
maintenant... compte tenu du fait que sous linux et autres, ce n'est pas si simple...
Avez-vous envisagé de simplement activer la parité pour le 'mot d'adresse' (celui dans lequel vous avez besoin de 9 bits ;) et ensuite de le régler sur impair ou pair, de le calculer de façon à ce que le bon soit choisi pour que le 9ème bit (parité) soit à '1' avec la parité activée et les 'données' à 8 bits, puis de désactiver la parité et d'activer 2 bits d'arrêt. (ce qui maintient toujours une longueur de mot de 9 bits pour votre microcontrôleur ;)... c'était il y a longtemps mais si je me souviens bien, les bits d'arrêt sont aussi longs que les bits de données dans le timing des choses.
cela devrait fonctionner sur tout ce qui peut faire une sortie 8 bits, avec parité, et avec 2 bits d'arrêt. ce qui inclut le matériel pc et linux. (et dos etc)
le matériel informatique dispose également d'options permettant d'activer ou de désactiver la "parité" pour tous les mots (sans la calculer) si je me souviens bien de l'époque.
De plus, le 9ème bit dont parle la fiche technique du PIC EST en fait le bit de parité comme dans les spécifications RS-232. Vous êtes juste libre de le désactiver ou de l'activer. (sur les PIC's en tout cas - sous linux c'est un peu plus compliqué que ça)
(rien que quelques réglages de termios sous linux ne puissent résoudre je pense... il suffit de l'allumer et de l'éteindre alors... nous avons fait faire des choses plus bizarres à ce truc ;)
un microcontrôleur pic fait exactement la même chose, c'est juste que ce n'est pas présenté comme "ce qu'il est réellement" dans la fiche technique. ils l'appellent en fait "le 9ème bit" et des choses comme ça. sur les pc et donc sous linux, cela fonctionne à peu près de la même manière.
de toute façon, si ce truc doit fonctionner dans les deux sens, alors bonne chance pour le câbler avec deux paires ou pour trouver un moyen de détecter les collisions, ce qui est beaucoup plus problématique que de sortir 9 bits.
dans tous les cas, ce n'est pas beaucoup plus qu'un registre à décalage surestimé. si l'uart du pc ne veut pas le faire (ce dont je doute), il suffit d'abuser de la broche DTR pour décaler les données à la main, ou d'abuser du port de l'imprimante pour faire la même chose, ou de brancher un registre à décalage sur le port de l'imprimante... mais avec l'astuce de la parité, ça devrait fonctionner correctement de toute façon.
#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);
};
Cela fonctionne en quelque sorte peut-être que certaines choses ne sont pas dans le bon sens mais cela envoie bien 9 bits. (CSTOPB met 2 stopbits, ce qui signifie que sur des données transparentes 8 bits le 9ème bit = 1, en mode adressage le 9ème bit = 0 ;)
Notez également que les niveaux de tension réels de la ligne rs232 sont inversés par rapport à ce que votre logiciel "lit" (qui est le même que les niveaux de ttl 5v "inversés" que votre microcontrôleur pic reçoit du transistor, de l'inverseur ou du clone max232). (-19v ou -10v (pc) pour la logique 1, +19/+10 pour la logique 0), les bits d'arrêt ont une tension négative, comme un 1, et la même longueur.
Les bits sortent de 0 à 7 (et dans ce cas : 8 ;)... donc bit de départ -> 0 ,1,2,3,4,5,6,7,
c'est un peu bricolé mais ça semble fonctionner sur la lunette.