Bonjour,
Pour une application communicante par port série, j'utilise le composant CPort et pour des besoins de test local, le projet "com0com" pour simuler des ports virtuels.
J'ai installé 2 séries de port: j'ai donc en port com virtuel CNCA0-CNCB0 et CNCA1-CNCB1.
Mon appli de test (qui envoie les commandes) à CNCA0 pour port sortant et CNCB1 pour port entrant.
Le programme qui reçoit les commandes et renvoie les réponses appropriées à CNCB0 pour port entrant et CNCA1 pour port sortant.
La communication fonctionne, cependant il se passe quelque chose que je ne comprends pas, à l'arrivée de la commande j'ai perdu les deux premiers octets !!?
Commande d'envoi:
Mon type TPacket est défini ainsi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 procedure TForm1.btComPortCNCA0SendClick(Sender: TObject); var aPacket: TPacket; begin _GET_InPacket(@aPacket); //Résolution intermédiaire-Décalé le packet de 2 octets MovePacketToRight(@aPacket); MovePacketToRight(@aPacket); //Bouffe 2 octest ComPortCNCA0.Write(aPacket.Buffer, aPacket.Size); end;
A la réception:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 const MAX_PACKET_SIZE = $0FFF; type TDataBuffer = array[0..MAX_PACKET_SIZE] of Byte; TPacket = record Size : Word; Buffer: TDataBuffer; end; PPacket = ^TPacket;
et donc si par exemple j'envoie:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 procedure TMCSimulator.ComPortCNCB0RxChar(Sender: TObject; Count: Integer); var aPacket: TPacket; begin //Clean = Fill with 0 CleanPacket(@aPacket); ComPortCNCB0.Read(aPacket, Count); // aPacket.Size:= Count; aPacket.Size:= Count - 2; //Résolution intermédiaire - et lire 2 octets de moins //See received cmd ePacketReceived.Text:= DisplayBufferChr(aPacket); end;
$7E $00 $01 $29 $09 $09 $11 $09 $22 $27 $00 $1E $12 $7E
et bien je reçois
$01 $29 $09 $09 $11 $09 $22 $27 $00 $1E $12 $7E $00 $00
je perds donc les 2 premiers octets
ma solution intermédiaire consiste à envoyer un paquet décalé de 2 octets vers la droite (ma fonction MovePacketToRight décale le packet de 1 et incrémente Packet.Size), ce qui m'oblige aussi à l'arrivée à lire 2 octets de moins, ce qui ne me plaît pas beaucoup au final et j'aimerais comprendre où sont passés mes deux premiers octets.
D'où cela peut-il venir ?
Partager