2010-12-03 7 views
0

J'ai une méthode DataReceived en cours de déclenchement d'une donnée est envoyée à partir d'un périphérique RS232. Les choses se passent bien avec le code suivantC# SerialPort DataReceived problème lorsque les chaînes attachées

byte[] data = new Byte[serialPort.BytesToRead]; 
serialPort.Read(data, 0, data.Length); 
string read = System.Text.Encoding.ASCII.GetString(data); 

mais si j'ajoute une chaîne après les données

string read = System.Text.Encoding.ASCII.GetString(data) + "asdf \n"; 

Les données sont encore reçues mais serait parfois être affiché de manière incorrecte. Par exemple. Si je me connecte à une balance et que je devrais lire «10.45kg asdf», cela apparaîtra sur mon ordinateur comme «10. asdf45kg». Quel est le problème ici?

+0

Pourriez-vous élaborer sur les appareils que vous utilisez ... Puisqu'il pourrait y avoir différents protocoles pour chaque appareil ... et nous devons envoyer une demande dans un format particulier. –

Répondre

4

La méthode DataReceived sera déclenchée lorsque le port série aura l'impression de le déclencher, ce qui n'est PAS nécessairement le cas lorsque vous recevez une chaîne complète de l'appareil. Voir this SO answer pour une excellente discussion des détails. Si vous disposez d'un caractère de terminateur connu, vous pouvez contourner ce problème en définissant la propriété NewLine de SerialPort, puis en utilisant ReadLine().

+0

mtrw, bonne suggestion. Cela a fonctionné maintenant. Mon instrument (un module de données sans fil) comprend un logiciel qui me permet de configurer le caractère EOP des données de l'instrument. J'ai choisi "~" pour être mon EOP et NewLine = "~". Ensuite, le problème est résolu. Mais que faire si je n'ai pas le logiciel. Comment pourrais-je ajouter l'EOP? En supposant que je ne peux pas écrire sur l'instrument pour changer son EOP. Comment ferais-je cela à partir de mon ordinateur? – KMC

+0

Bien que le problème soit résolu, j'apprécierais que quelqu'un m'explique le concept derrière la Newline? Donc DataReceived est déclencher à tout moment entre les cadres de caractères? Si j'ai limité le NewLine à un certain caractère - avant que la chaîne complète soit transmise à l'ordinateur, où se cache la chaîne partielle? – KMC

+1

En général, la spécification de périphérique vous indique le caractère Fin de ligne/Fin de paquet. Vous n'avez pas (habituellement) l'occasion de le changer. Je vous recommande d'utiliser newline ou le retour chariot ('\ n' ou '\ r') pour le caractère EOL, c'est assez commun. En ce qui concerne votre deuxième question, la chaîne partielle se cache dans le tampon interne du port série, ou dans le tampon interne de l'OS de bas niveau associé. L'événement est déclenché par l'OS lorsqu'il remarque qu'il y a au moins quelques caractères à lire. – mtrw

Questions connexes