Bonjour,
Pour dialoguer avec un systeme externe (mC), via le port série, nous utilisons le composant TComPort.
Le principe du protocole de dialogue est un mirroir (chaque octet envoyé est retourné par le mC et nous devons attendre le retour pour envoyer l'octet suivant).
Nous traitons le dialogue dans l'evènement OnRxChar où nous recevons 1 octet et envoyons immédiatement le suivant ce qui a pour effet d'alimenter constament le dialogue.
Configuration du port : 19200 bauds, 8 bits, pas de parité et 1 bit de stop.
Problème :
Avec cette methode nous mettons 3 ms à renvoyer un caratère après en avoir reçu 1,(Mesures faites à l'oscilloscope) et nous avons l'assurance que le mC réagit immédiatement.
Comment pourrait-on améliorer le programme pour ne pas perdre ces 3 ms qui sont trop pénalisantes pour notre système?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 //------------------------------------------------------------------------------ void __fastcall TForm1::Envoi (__int8 *Octet) { ComPort1->Write(Octet,1); } //------------------------------------------------------------------------------ void __fastcall TForm1::Recoit(__int8 *Octet) { Form1->ComPort1->Read(Octet,1); } //------------------------------------------------------------------------------ void __fastcall TForm1::ComPort1RxChar(TObject *Sender, int Count) { char Octet; while(ComPort1->InputCount()!=0); { Recoit(&Octet); switch (Dialogue.Type) { case 1: switch (Dialogue.Octet) { case 1: //Reception N° Esclave Dialogue.Octet=2; Envoi (&Dialogue.Type); break; case 2: //Reception Type de dialogue Dialogue.Octet=3; break; case 3: //Reception de l'octet d'état Dialogue.Octet=4; Canton[Dialogue.Esclave].Etat=Octet; Envoi(&Octet); break; case 4: //Reception N° Esclave (Acquittement) Dialogue.Octet=1; Dialogue.Esclave=RechercheCantonSuivant(Dialogue.Esclave); Octet=Dialogue.Esclave|0x80; Envoi(&Octet); //Relance du dialogue suivant break; } break; case 2: break; case 3: break; case 4: break; } } }
Nous vous remercions d'avance pour l'intérêt que vous voudrez bien porter à ce post et pour les solutions que vous pourrez y apporter.
PhDt
Partager