Utilisation de Tcomport

Résolu
cs_CHARLI78 Messages postés 8 Date d'inscription dimanche 9 avril 2006 Statut Membre Dernière intervention 14 avril 2006 - 11 avril 2006 à 09:13
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 - 14 avril 2006 à 15:06
Bonjour à tous,

Je suis nouveau sur le forum, et novice en POO... J'utilise Delphi 4.
Je souhaite utiliser Tcomport pour recevoir des trames de données binaires à 9600 bauds. Elles sont émises par un microcontroleur. La trame fait toujours 10 octets, mais la cadence à laquelle elles sont émises par le UC change (de 2 trames secondes à 10 trames secondes). Il n'y a pas de contrôle de flux, donc le UC envoie autoritairement ces trames de données binaires.
J'ai essayé de les récupérer à l'aide de OnRxChar, avec Comport.read(data,1). Je lis donc mes octets un par un puis les visualise à l'aide de Memo.text.

Ca marche à peu près, mais j'ai rencontré les problèmes suivants:
- Si l'émission des trames s'interrompt, mon affichage de données s'interrompt aussi alors que le buffer contient encore une cinquantaine de data. Je m'en suis apperçu en reprenant l'émission avec des trames de tests (donc différentes au niveau des datas), et les 50 (environ) premières datas affichées correspondaient à des anciennes données stockées dans le buffer.

- Si la trame est composé de la valeur 0 (en binaire et non pas le caractère), cette valeur ne semble pas vu par comport.Read. J'ai vu sur le forum qu'un autre développeur a rencontré exactement le même problème. Il n'y a pas eu de solution proposé, et il a contourné le problème en générant des trames ASCII et non pas binaire. Dans mon application je ne peux pas modifier le format des trames de données reçues. Je suis donc condamné à trouver une solution.

Mes questions:
- Le composant TCOMPORT est il conçu pour recevoir des données binaires? Si oui, y a-t-il un paramétrage à effectuer pour l'informer d'interpréter correctement une donnée reçue?
- Comment résoudre le traitement de la valeur 0 lors d'une réception?
- Comment utiliser Tcomport pour que les datas reçues soient instantannément lues au lieu d'être stockée plus ou moins longtemps dans le buffer?
- Quelqu'un peut il me faire parvenir un programme fonctionnel complet pour Delphi 4 utilisant Tcomport pour recevoir des trames binaires sans contrôle de flux afin que je comprenne bien toutes les subtilités afin de ne pas perdre des données en cours de route, ou bloquer le programme à cause d'une absence de Time-out? (Je le redis, je suis totalement novice POO).

Merci à tous pour votre aide


Christian

22 réponses

jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
11 avril 2006 à 11:23
salut,

c'est pas un problème de recevoir de données binaire avec Tcomport.

1ere chose quand tu utilises l'évèment OnRxChar utilises la variable
count pour lire l'ensemnble des données contenue dans le buffer faire
read (data,1) risque de te faire perdre des données (c'est du à la
gestion des évent par Windows)

si ta trame fait toujours 10 octets le plus simple c'est de faire:



si tu lance un timeout externe;

timeout.enabled:=true;

while (Comport1.inputcount<10)and timeout.enabled do Application.ProcessMessages;//pour ne pas bloquer

if not timeout.enabled then // si le temps est dépassé

begin

showmessage('Erreur Communication')

exit; on sort sinon ça plante

end;

comport1.read(data,10);//on reçoit la totalité de la trame

ton data peut être un record si tes données peuvent être structurées;



personnellement je préfère passer par un string même pour des données
binaires; en effet dans ce cas Comport se moque éperdument du type de
données qui sont reçues et on crée un tableau dynamique dont chaque
caractère est un octet ensuite il suffit de transtyper pour récuperer
les valeurs

par exemple si tu reçois une trame binaire constituée :

d'un char+2 integer+un boolean

var

chaine:string;

caractere:char

val1,val2:integer;

flag:boolean;

valint:^integer

valbool:^boolean;

begin

while Comport1.inputcount<10 do Application.ProcessMessages;//pour ne pas bloquer


comport1.readstr(chaine,10);//on reçoit la totalité de la trame

caractere:=chaine[1];

valint:=@chaine[2];

val1:=valint^;

valint:=@chaine[6];


val2:=valint^;

valboolt:=@chaine[10];

flag:=valbool^;



@+

jlen
3
Rejoignez-nous