cs_Francois F
Messages postés4Date d'inscriptionmercredi 28 septembre 2005StatutMembreDernière intervention13 février 2008
-
12 févr. 2008 à 18:13
lo_63
Messages postés12Date d'inscriptionvendredi 20 janvier 2006StatutMembreDernière intervention15 février 2008
-
15 févr. 2008 à 15:06
Bonjour à tous,
Je voudrais savoir s'il y en a qui ont déjà utilisé une liaison série avec un protocole 9 bit.
Pour l'instant j'utilise l'API de windows à partir de delphi. Ca marche très bien avec 8 bit.
Il existe bien le paramètre ByteSize mais il est limité à 8 bit.
BYTE ByteSize; // number of bits/byte, 4-8
Le "protocole" 9 bit est simplement un bit supplémentaire que l'on ajoute au 8 bit du byte. Je m'en sers pour faire une communication sur un bus multiprocesseurs (carte à microcontrolleur). Le 9ième bit sert à indiquer si on envoie une donnée ou une adresse, ce qui permet, au niveau des cartes esclaves de travailler sur interruption lorsqu'on reçoit une adresse (9ième bit ou bit 8 1) (bit 8 car le 1er bit est le bit 0à) et de ne pas être interrompu par les données (bit 8 0), ce qui simplifie fortement le programme.
Donc je me demande s'il y a une astuce pour le faire avec l'api de windows ou s'il existe un composant à ajouter qui permettrait de le faire.
cs_Francois F
Messages postés4Date d'inscriptionmercredi 28 septembre 2005StatutMembreDernière intervention13 février 2008 13 févr. 2008 à 09:00
[auteur/LO63/672958.aspx lo_63], j'ai pensé aussi au bit de parité, en utilisant une parité mark ou space.
Le problème c'est qu'il faudrait, chaque fois passer par le Setcomstate et de changer le type de parité à chaque fois que l'on désire changer le bit 8.
càd:
if GetCommState (hPort,dcbCom) then
begin
dcbCom.Baudrate:=baudrate; //baudrate
dcbCom.ByteSize:=8;
dcbCom.Parity:=Byte(Parity);
dcbCom.Flags:=0;
SetCommState (hPort, dcbCom);
end;
Ce qui me gène c'est que je ne sais pas si c'est le plus efficace (est-ce que le changement peut fonctionner suffisamment rapidement ou y a-t-il un delai qui correspond au temps d'émission de plusieurs byte,
qu'est-ce qui se passe si je fais le changement et que le buffer est plein?
Je pensais qu'il y avait moyen de passer par la EscapeCommFunction, pour changer la parité, comme on le fait pour lire ou écrire les lignes d'entrée - sortie du port.
command:=SETDTR;
if (EscapeCommFunction (form1.hPort,command)=false) then
MessageDlg ('Error changing signal : '+#13+#10+SysErrorMessage(GetLastError), mtError,[mbOk],0);
A tester pour voir si ça fonctionne.
[auteur/F0XI/360948.aspx f0xi], je suppose que tu veux dire envoyer 2 bytes et de n'utiliser qu'un bit pour le 2ième. Si c'est ça, le problème est que la structure n'est pas correcte (elle n'est pas changée, toujours start bit + 8 bit + 1 bit de stop.
De plus je ne maitrise pas l'analyse des données au niveaux des cartes esclaves à microcontrolleurs car l'usart (dispositif qui s'occupe de la liaison série) est en hardware, ce qui signifie que je ne sais rien changer moi même puisque graver dans le silicium.