2010-12-03 6 views
0

Ich habe eine DataReceived-Methode, die Trigger eine Daten von einem RS232-Gerät gesendet wird. Einen reibungslosen Ablauf mit dem folgenden CodeC# SerialPort DataReceived Problem, wenn bei angehängten Zeichenfolgen

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

aber wenn ich einen String nach einer Daten

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

Die Daten hinzufügen, ist noch erhalten, aber gelegentlich falsch angezeigt werden würde. Z.B. wenn ich an eine Waage anschließe und "10.45kg asdf" lesen sollte, würde es auf meinem Computer als "10. asdf45kg" angezeigt. Was ist das Problem hier?

+0

Könnten Sie bitte näher erläutern, welche Geräte Sie verwenden .... Da es für jedes Gerät verschiedene Protokolle geben kann ... und wir müssen eine Anfrage in einem bestimmten Format senden. –

Antwort

4

Die Methode DataReceived wird ausgelöst, wenn der serielle Anschluss das Gefühl hat, sie auszulösen, was NICHT unbedingt der Fall ist, wenn Sie eine vollständige Zeichenfolge vom Gerät empfangen. Eine ausführliche Besprechung der Details finden Sie unter this SO answer. Wenn Sie über ein bekanntes Terminator-Zeichen verfügen, können Sie dieses Problem umgehen, indem Sie die NewLine Eigenschaft des SerialPort festlegen und dann ReadLine() verwenden.

+0

mtrw, schöner Vorschlag. Es hat jetzt funktioniert. Mein Instrument (ein drahtloses Datenmodul) enthält eine Software, mit der ich das EOP-Zeichen der Gerätedaten konfigurieren kann. Ich wählte "~" als EOP und NewLine = "~". Dann ist das Problem gelöst. Aber was ist, wenn ich die Software nicht habe? Wie würde ich das EOP hinzufügen? Vorausgesetzt, ich kann nicht in das Instrument schreiben, um seine EOP zu ändern. Wie würde ich das von meinem Computer aus tun? – KMC

+0

Obwohl Problem gelöst, würde ich mich freuen, wenn mir jemand das Konzept hinter dem Newline erklären würde? Also wird DataReceived jedes Mal zwischen Zeichenrahmen ausgelöst? Wenn ich die NewLine auf ein bestimmtes Zeichen beschränkt habe - bevor die vollständige Zeichenfolge an den Computer übertragen wird, wo versteckt sich die Teilzeichenfolge? – KMC

+1

Im Allgemeinen teilt Ihnen die Gerätespezifikation das Ende der Zeile/Ende des Pakets mit. Sie können es (normalerweise) nicht ändern. Ich würde empfehlen, entweder Newline oder Carriage Return ('\ n' oder '\ r') für das EOL-Zeichen zu verwenden, das ist ziemlich üblich. Was Ihre zweite Frage anbelangt, versteckt sich die Teilzeichenfolge im internen Puffer des seriellen Ports oder im zugehörigen internen Puffer des Low-Level-Betriebssystems. Das Ereignis wird vom Betriebssystem ausgelöst, wenn es feststellt, dass mindestens einige Zeichen zum Lesen verfügbar sind. – mtrw

Verwandte Themen