質問

.Net Framework 2.0 Serialport クラスを使用して、COM1 経由でコントローラー カードと通信する簡単なアプリを C# 2.0 で作成しました。

最近、Read メソッドによって返されるバイトが正しくないという問題が発生しました。正しい量のバイトが返されましたが、値が間違っていただけです。ただし、Delphi で作成された同様のアプリは依然として正しい値を返しました。

私が使用した ポートモン 両方のアプリのシリアル ポートのアクティビティをログに記録するために、2 つのログを比較し、設定が (明らかに) わずかに異なる箇所があり、Delphi アプリをできるだけ忠実に模倣しようとしましたが、役に立ちませんでした。

では、Read メソッドによって返されるバイト値には何が影響するのでしょうか?

2 つのアプリ間のほとんどの設定は同一です。

Portmon ログ内で異なる行のリストを次に示します。

Delphi アプリ:

IOCTL_SERIAL_SET_CHAR Serial0 成功 EOF:直流エラー:0 ブレーキ:0 EVT:0 XON:11 XOFF:13
IOCTL_SERIAL_SET_HANDFLOW SERIAL0成功シェイク:0置換:0 Xon制限:256 Xoffリミット:256 IOCTL_SERIAL_SET_TIMEOUTS Serial0 成功 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 RX80フル

C# アプリ:

IOCTL_SERIAL_SET_CHAR Serial0 成功 EOF:1aエラー:0 ブレーキ:0 EVT:1a xon:11 xoff:13 ioctl_serial_set_handflow serial0成功シェイク:0置換:0 Xon制限:1024 XoffLimit:1024 IOCTL_SERIAL_SET_TIMEOUTS Serial0 成功 RI:-1 RM:-1 RC:1000 WM:0 WC:1000 IOCTL_SERIAL_SET_WAIT_MASK Serial0 SUCCESS マスク:rxchar rxflag cts dsr rlsd brk errリング

アップデート:

正しく返されたバイトは次のとおりです。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 でフレーム エラーが発生するのかということです。

役に立ちましたか?

解決

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

どうやら、フレーミング エラーにより不正な値が返されたようです。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 = trueC# アプリは次のログ エントリを生成します。

IOCTL_SERIAL_SET_HANDFLOW Serial0 Success シェイク:1 交換:0 xonlimit:1024 xofflimit:1024

これでフレームエラーは防げたようで、アプリケーションは正常に動作しているようです。

他のヒント

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

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

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

バイト配列を読み取っている場合 (例:SerialPort.Read) を実行すると、PortMon で表示されているバイトを正確に取得できるはずです。

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

回線上のバイトと同じバイナリ値を持つ文字を表示したい場合は、「」で説明されているように、Latin-1 を使用するのが適切なエンコーディングです。 この郵便受け.

例:

SerialPort.Encoding = Encoding.GetEncoding("Latin1")
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top