2016-11-23 2 views
-1

J'ai un code Delphi 7 qui reçoit les valeurs de capteur d'un DSP TMS32F28069. La valeur reçue par Delphi est donnée par le fichier Hex. Par exemple, j'envoie des données:Données manquées reçues à l'aide du port série 411f delphi 7

F1; 01; 01; 07; 00; 00; 0A; 00; 00; 00; 00; F7

de DSP.

J'utilise Comport 411f et en fait quand j'utilise Windows 10 64 bits version anglaise tout va bien. Mais quand j'utilise Windows chinois 64 bits, les données qui sont parfois bien reçues changent parfois. J'ai essayé plusieurs portables en utilisant Windows 7 64 bits version chinoise, et il a le même problème. Les fichiers reçus sur Windows 7 64 bits version chinoise de répresentation:

F1; 01; 01; 01; 00; 00; 00; F7; 00; 00; F7; 00.or F1; 01; 07; 01 ; 00; 0A; 00; 00; F7 F7; 00; 00

et toujours change.This est le code que j'ai écrit en Delphi 7:

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer); 
var 
p:integer; 
r:array[1..12]of integer; 
h:array[1..12]of String; 
begin 
    comport1.Open; 
    for p:=1 to 12 do 
    begin 
    comport1.Read(r[p],1); 
    h[p]:= IntToHex((r[p]),2); 
    sMemo3.Text:= h[1]+';'+h[2]+';'+h[3]+';'+h[4]+';'+h[5]+';'+h[6]+';'+h[7]+';'+h[8]+';'+h[9]+';'+h[10]+';'+h[11]+';'+h[12];//Show data Receive on Memo4// 
    end; 
end; 

S'il vous plaît me donner toute suggestion pourquoi cette arrivé sur Windows 7 64 bits version chinoise? parce que quand j'utilise la version anglaise de Windows 7 64 bits, c'était aussi très bien.

Merci

+0

Le 'ComPort1RxChar' a une entrée' count'. C'est le nombre d'octets reçus. Vous devez l'utiliser pour remplir un tampon de portée globale et, une fois tous les octets reçus, vous devez interpréter le message complet. –

+0

Avez-vous un exemple de code? je voudrais l'essayer. Je vous remercie. –

+0

Vous mettez également à jour le mémo dans la boucle, ce qui est un peu inutile. Mettez à jour une fois, lorsque le message est terminé. –

Répondre

1
  1. Remove comport1.Open - il est ouvert sans aucun doute si l'événement se produit RxChar

  2. tableau entier local est rempli de quelques conneries. comport1.Read(r[p],1); remplit seulement un octet. Donc, utilisez le tableau d'octets

  3. Vous obtenez un tableau de données complet après chaque octet - c'est une méthode étrange.

  4. Lorsque l'événement se déclenche, le tampon de port contient Count octets - afin de lire le nombre réel d'octets. Meilleure approche - accumuler les informations reçues dans un tableau global (ou ansistring) et les traiter lorsque 12 octets sont reçus.


Buffer: AnsiString; 
... 

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer); 
var 
    sa: AnsiString; 
    ByteBuf: array[1..12] of Byte; 
begin 
    SetLength(sa, Count); 
    comport1.Read(sa[1], Count); 
    Buffer := Buffer + sa; 
    while Length(Buffer) >= 12 do begin 
     Move(Buffer[1], ByteBuf, 12); 
     TreatData(ByteBuf); 
     Delete(Buffer, 1, 12); 
    end; 
end; 

procedure TreatData(bb: array of Byte); 
//treat and output here 
+0

Salut Mbo, Pourriez-vous également publier la fonction TreatData, je voudrais l'essayer. Désolé puisque je suis débutant. Je vous remercie. –

+0

Salut Mbo, je peux implémenter votre code, et son travail en ce moment. Merci beaucoup pour votre aide. –