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:
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;
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
const
  MAX_PACKET_SIZE = $0FFF;
type
TDataBuffer = array[0..MAX_PACKET_SIZE] of Byte;
TPacket = record
    Size  : Word;
    Buffer: TDataBuffer;
  end;
  PPacket = ^TPacket;
A la réception:
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;
et donc si par exemple j'envoie:
$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 ?