2010-03-16 10 views
2

Toutes mes excuses pour cette question, mais je suis un peu un expert avec Delphi. J'utilise le composant Dejan TComport pour obtenir des données à partir d'un port série. Une boîte d'équipement connectée au port envoie environ 100 octets de données binaires au port série. Ce que je veux faire est d'extraire les octets comme des valeurs numériques dans un tableau afin que je puisse effectuer des calculs sur eux. TComport a une méthode Read (buffer, Count) qui lit DATA à partir du buffer d'entrée.Lecture de données binaires à partir du port série à l'aide de Dejan TComport Composant Delphi

function Read(var Buffer; Count: Integer): Integer; 

L'aide indique la variable tampon doit être suffisamment grand pour contenir Count octets mais ne fournit aucun exemple de la façon d'utiliser cette fonction. Je peux voir que la variable Count contient le nombre d'octets reçus mais je ne trouve pas un moyen d'accéder aux octets dans Buffer. TComport dispose également d'une méthode ReadM qui lit les données du tampon d'entrée dans une variable STRING.

function ReadStr(var Str: String; Count: Integer): Integer; 

Encore une fois la variable Count indique le nombre d'octets reçus et je peux utiliser Memo1.Text: = str pour afficher des informations, mais de toute évidence Memo1 a des problèmes pour afficher les caractères de contrôle. J'ai essayé plusieurs manières d'essayer d'extraire les données d'octets de Str mais jusqu'ici sans succès.

Je suis sûr que ça doit être facile. En espérant.

Répondre

2

Dans cette fonction

function Read(var Buffer; Count: Integer): Integer; 

Le paramètre Count est le nombre d'octets que vous prévoyez de lire. Alors que la valeur de retour de la fonction est réellement octets lus.

Si vous avez une mémoire tampon définie comme un tableau de 100 octets vous pouvez coder

x := Read(Buffer, 100); 

et si l'entrée est à seulement 70 octets alors X sera 70. De cette façon, vous pouvez lire tout x> 0

+0

Si les données sont lues dans une boucle, le paramètre 'Buffer' ne doit pas être le tableau complet, mais l'élément suivant du tableau dans lequel écrire. – mghie

+0

le tampon devrait être un "tampon de travail" ajouter son contenu à la variable finale –

+0

Vous devriez étoffer votre réponse afin que cela devienne plus clair. – mghie

0
// I use a timer to read a weight coming in on the Serial Port 
// but the routing could also be triggered by OnRXChar (received data event) 
// or OnRXBufferFull event. 

var 
    WeightString: String; //global 

procedure TfmUDF.tmScaleTimer(Sender: TObject); 
var 
    Data: AnsiString; 
begin 
    ReadStr(Data,Count); //the individual bytes can be read Data[n]..... 
    WeightData:=WeightData+Data; //just keeps adding the incoming data 
end; 

Cela aide-t-il?

Questions connexes