2017-02-11 4 views
1

Ich versuche, mit einem Laborinstrument zu kommunizieren, das ein paar verschiedene Befehle akzeptiert. Das Gerät verwendet nur einen Wagenrücklauf zum Beenden - kein Zeilenvorschub.Carriage Return Problem mit SerialPort

Wenn ich RealTerm verwende und die Verbindung nach Bedarf festlege, kann ich einen der ASCII-Befehle zusammen mit einem CR Zeichen senden. Das Gerät liefert die richtige Antwort.

Bei der Verwendung von .NET SerialPort Objekt scheint jedoch \r in C# nicht unbedingt korrekt, denn jedes Mal, wenn ich es sende, gibt mein Instrument einen Fehlercode für einen Drucker Timeout/Fehler (der RS-232-Port ist ein "Drucker", aber das Handbuch legt auch fest, wie eine Verbindung zu einem PC hergestellt wird.

Ich habe sicher verifiziert, dass die NewLine-Eigenschaft meines Ports auf \r festgelegt ist. Hier ein paar Dinge, die ich habe versucht:

_port.WriteLine(command); // error at the instrument once this executes. 
_port.Write(command + _port.NewLine); // also error. 
_port.Write(command); // executes without error, but next line errors: 
_port.Write(_port.NewLine); 

Gibt es einen grundlegenden Unterschied zwischen den CR in Realterm vs. \r in C#? Oder könnte da noch etwas anderes ins Spiel kommen?

+1

Haben Sie versucht, _port.NewLine zu konfigurieren, d. H. _port.NewLine = "\ r"? – Graffito

+0

Führen Sie ein Tool wie [portmon] (https://technet.microsoft.com/en-us/sysinternals/bb896644.aspx) aus, das einen guten manuellen Befehl mit dem vergleicht, was Ihr Code sendet, der Unterschied ist das Problem. –

+0

Ein Programm wie RealTerm übersetzt eine Enter-Taste auf ein beliebiges Zeichen. Wie für die Verbindung konfiguriert. Wie die, die Sie noch nicht ausprobiert haben und häufig vorkommen, wie "\ n" und "\ r \ n" –

Antwort

0

Ich habe das herausgefunden, für meinen Anwendungsfall sowieso - ich musste DtrEnable = true; setzen, um die Fehler zu stoppen. Ich habe ein Programm ("AccessPort") bekommen, um meinen Port erfolgreich auszuführen und auszuspionieren. Während sowohl mein Code als auch RealTerm genau die gleichen Bytes geschrieben haben, bemerkte ich, dass die Bitmasken in der Treiberkonfiguration ein bisschen anders waren. Obwohl ich in RealTerm den Handshake und die Flusskontrolle deaktiviert hatte, wurde DTR immer noch aktiviert, nachdem ich die Header-Dateien des Treibers durchsucht hatte. Das gleiche Problem in meinem Code behoben das Problem.

Verwandte Themen