Frage

Ich habe eine einfache Anwendung in C # 2.0 mit .NET Framework 2.0 Serialport Klasse geschrieben mit einer Controller-Karte über COM1 zu kommunizieren.

ist ein Problem aufgetreten waren vor kurzem des Bytes durch die Read-Methode falsch zurückgegeben. Er kehrte die richtige Menge an Bytes, nur die Werte waren nicht korrekt. Eine ähnliche Anwendung in Delphi geschrieben zurückgegeben noch die allerdings korrekten Werte.

Ich benutzte Portmon die Aktivität auf dem seriellen Port anmelden beiden Anwendungen, verglich die beiden Protokolle und dort, wo einige (scheinbar) geringfügige unterschiedliche Einstellungen und ich den ahmt den Delphi-App so gut wie möglich versucht, aber ohne Erfolg.

Also, was könnte die Byte-Werte zurückgegeben von Read-Methode beeinflussen?

Die meisten Einstellungen zwischen den beiden Anwendungen sind identisch.

Hier ist eine Liste der Linien, die im Portmon Protokoll unterschieden:

Delphi App:

  

IOCTL_SERIAL_SET_CHAR Serial0 ERFOLG EOF: dc   ERR: 0 BRK: 0 EVT: 0 XON: 11 XOFF: 13
  IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS-Shake: 0   Ersetzen: 0 XonLimit: 256    XoffLimit: 256 IOCTL_SERIAL_SET_TIMEOUTS Serial0 ERFOLG RI: -1    RM: 100 RC: 1000 WM: 100 WC: 1000 IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS-Maske:   RXCHAR RXFLAG TXEMPTY CTS DSR RLSD   BRK ERR RING RX80FULL

C # App:

  

IOCTL_SERIAL_SET_CHAR Serial0 ERFOLG EOF: 1a   ERR: 0 BRK: 0 EVT: 1a XON: 11 XOFF: 13   IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS-Shake: 0   Ersetzen: 0 XonLimit: 1024    XoffLimit: 1024 IOCTL_SERIAL_SET_TIMEOUTS Serial0 ERFOLG RI: -1    RM: -1 RC: 1000 WM: 0 WC: 1000 IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS-Maske:   RXCHAR RXFLAG CTS DSR RLSD BRK ERR   RING

UPDATE:

Das korrekte Bytes zurückgegeben war: 91, 1, 1, 3, 48, 48, 50, 69, 66, 51, 70, 55, 52, 93 (14 Bytes). Der letzte Wert eine einfache Prüfsumme zu sein.

Die falschen Werte zurückgekehrt waren: 91, 241, 254, 252, 242, 146, 42, 201, 51, 70, 55, 52, 93 (13 Bytes)

.

Wie Sie den ersten und den letzten fünf Bytes zurück entsprechen sehen können.

Das ErrorReceived Ereignis zeigt an, dass ein Rahmenfehler aufgetreten, der die falschen Werte erklären könnte. Aber die Frage ist, warum würde ein Serialport-Framing-Fehler auftreten, wenn die Delphi app anscheinend nicht?

War es hilfreich?

Lösung

Nun, es scheint, als ob das Problem (zumindest für den Augenblick) gelöst wurde.

Offenbar ein Rahmenfehler verursacht die Rückkehr von falschen Werten. Ich schrieb eine VB6-Anwendung, die MSComm Steuerung verwenden, die gut funktioniert, und die Log-Dateien von Portmon erzeugt verglichen.

Ich nahm die folgenden Unterschiede auf

VB6 App:

  

IOCTL_SERIAL_SET_HANDFLOW Serial0   ERFOLG schütteln: 1 Ersetzen: 0   XonLimit: 256 XoffLimit: 256

C # App:

  

IOCTL_SERIAL_SET_HANDFLOW Serial0   ERFOLG schütteln: 0 ersetzen: 0   XonLimit: 1024 XoffLimit: 1024

Herumspielen mit den Einstellungen fand ich, dass, wenn ich gesetzt _serialPort.DtrEnable = true die C # App erzeugt den folgenden Protokolleintrag:

  

IOCTL_SERIAL_SET_HANDFLOW Serial0   ERFOLG schütteln: 1 Ersetzen: 0   XonLimit: 1024 XoffLimit: 1024

Das schien den Framing-Fehler zu vermeiden und die Anwendung scheint gut zu funktionieren.

Andere Tipps

Haben Sie die Einstellungen für die Anzahl der Datenbits überprüft, Stoppbits und Parität?

Das Paritätsbit ist eine Art von Fehlererkennungsmechanismus. Zum Beispiel: Wenn Sie mit 7 Datenbits und ein Paritätsbit senden, wird das achte Bit zur Erkennung Bitinvertierung Fehler verwendet werden. Wenn der Empfänger erwartet 8 Datenbits und keine Parity-Bits, wird das Ergebnis nicht korrekt ausgegeben werden.

Leider erwähnen Sie nicht genau, welche Art von Unterschieden Sie erhalten. Ist es ein gelegentliches Zeichen, das andere ist oder alle eingehenden Daten verstümmelt? Beachten Sie, dass durch die SerialPort.Read Lesefunktion Zeichen durch das System aufgrund der Einstellung des SerialPort.Encoding Eigenschaft. Diese Einstellung wirkt sich auf die Interpretation des eingehenden Text, wie er Text in ASCII war, Unicode, UTF8 oder andere Codierungsschema verwendet Windows für ‚raw Byte (e)‘ auf ‚lesbaren Text‘ Konvertierung.

Wenn Sie in ein Byte-Array lesen (ex: SerialPort.Read). Sie sollten genau das bekommen, die Bytes, die Sie auf PortMon sehen

Wenn Sie Zeichen (SerialPort.ReadLine oder SerialPort.ReadChar) konvertieren, dann werden die Daten verschlüsselt werden, um die aktuelle Codierung (SerialPort.Encoding Eigenschaft), die die Unterschiede erklären Sie sehen.

Wenn Sie Zeichen sehen, mit den gleichen binären Werten wie der Bytes auf dem Draht, eine gute Codierung verwenden wollen, ist Latin-1, wie in dieser Beitrag .

Beispiel:

SerialPort.Encoding = Encoding.GetEncoding("Latin1")
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top