4

.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 でフレーミング エラーが発生するのでしょうか?

4

4 に答える 4

2

まあ、問題は解決したようです(少なくとも当面は)。

どうやらフレーミングエラーが原因で誤った値が返されました。MSCommコントロールを使用してVB6アプリを作成しました。これは正常に機能し、Portmonによって生成されたログファイルを比較しました。

私は次の違いを拾いました

VB6アプリ:

IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESSシェイク:1置換:0 XonLimit:256 XoffLimit:256

C#アプリ:

IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESSシェイク:0置換:0 XonLimit:1024 XoffLimit:1024

設定をいじってみると _serialPort.DtrEnable = true 、C#アプリを設定すると、次のログエントリが生成されることがわかりました。

IOCTL_SERIAL_SET_HANDFLOW Serial0 SUCCESSシェイク:1置換:0 XonLimit:1024 XoffLimit:1024

これによりフレーミングエラーが防止され、アプリケーションは正常に動作しているようです。

于 2008-10-08T15:44:56.407 に答える
0

残念ながら、どのような種類の違いが生じるかについては正確に言及していませんでした。それは時折異なるキャラクターですか、それともすべての受信データが文字化けしていますか?SerialPort.Read関数を介して読み取られる文字は、 SerialPort.Encodingプロパティの設定により、システムによって変更される可能性があることに注意してください。この設定は、ASCII、Unicode、UTF8、またはWindowsが「生のバイト」から「読み取り可能なテキスト」への変換に使用するその他のコーディングスキームのテキストであるため、着信テキストの解釈に影響します。

于 2008-09-23T08:16:31.977 に答える
0

データビット数、ストップビット、パリティの設定を確認しましたか?

パリティビットは一種のエラー検出メカニズムです。例:7データビットと1パリティビットを使用して送信する場合、8番目のビットはビット反転エラーの検出に使用されます。受信機が8データビットを期待し、パリティビットを期待しない場合、結果は文字化けします。

于 2008-09-22T22:16:33.213 に答える
0

バイト配列 (例: SerialPort.Read) を読み取る場合は、PortMon で表示されているバイトを正確に取得する必要があります。

文字 (SerialPort.ReadLine または SerialPort.ReadChar) に変換する場合、データは現在のエンコーディング (SerialPort.Encoding プロパティ) を使用してエンコードされます。これにより、表示されている違いが説明されます。

ネットワーク上のバイトと同じバイナリ値を持つ文字を表示する場合は、この投稿で説明されているように、Latin-1 を使用することをお勧めします。

例:

SerialPort.Encoding = Encoding.GetEncoding("Latin1")
于 2008-09-23T11:57:55.750 に答える