.Net Framework 2.0 Serialport クラスを使用して C# 2.0 で簡単なアプリを作成し、COM1 経由でコントローラー カードと通信しました。
最近、Read メソッドによって返されるバイト数が正しくないという問題が発生しました。正しいバイト数が返されましたが、値だけが正しくありませんでした。ただし、Delphi で作成された同様のアプリでも正しい値が返されました。
Portmonを使用して両方のアプリのシリアル ポートでのアクティビティをログに記録し、2 つのログを比較して、(明らかに) マイナーな設定の違いがいくつかある場所で、Delphi アプリをできるだけ厳密に模倣しようとしましたが、役に立ちませんでした。
では、Read メソッドによって返されるバイト値に何が影響するのでしょうか?
2 つのアプリのほとんどの設定は同じです。
Portmon ログで異なる行のリストを次に示します。
デルフィ アプリ :
IOCTL_SERIAL_SET_CHAR Serial0 SUCCESS EOF:dc ERR:0 BRK:0 EVT:0 XON:11 XOFF:13
IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake:0 Replace:0 XonLimit:256 XoffLimit:256 IOCTL_SERIAL_SET_TIMEOUTS Serial0 SUCCESS RI:-1 RM:100 RC:1000 WM :100 WC:1000 IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS マスク: RXCHAR RXFLAG TXEMPTY CTS DSR RLSD BRK ERR RING RX80FULL
C# アプリ:
IOCTL_SERIAL_SET_CHAR Serial0 SUCCESS EOF:1a ERR:0 BRK:0 EVT:1a XON:11 XOFF:13 IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESS Shake:0 Replace:0 XonLimit:1024 XoffLimit:1024 IOCTL_SERIAL_SET_TIMEOUTS Serial0 SUCCESS RI:-1 RM:-1 RC:1000 WM:0 WC:1000 IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS マスク: RXCHAR RXFLAG CTS DSR RLSD BRK ERR RING
アップデート:
返された正しいバイトは、91、1、1、3、48、48、50、69、66、51、70、55、52、93 (14 バイト) でした。最後の値は単純なチェックサムです。
返された不正な値: 91、241、254、252、242、146、42、201、51、70、55、52、93 (13 バイト)。
ご覧のとおり、返された最初と最後の 5 バイトは対応しています。
ErrorReceived イベントは、フレーミング エラーが発生したことを示します。これにより、誤った値が説明される可能性があります。しかし問題は、Delphi アプリではフレーミング エラーが発生しないように見えるのに、なぜ SerialPort でフレーミング エラーが発生するのでしょうか?