2011-07-25 13 views
2

ここにシナリオがあります - 私はCOMポートから読み込むC#アプリケーションを持っています。ほとんどの場合、私はシリアルアダプタを備えた機器とシリアルポートを備えた機器を使用しています。しかし、シリアルポートを持つマシンは、私がUSB /シリアル接続を使用してマシンを使用し始めたので、ますます難しくなってきています。C#COMポートの通信 - USBとシリアルアダプタのエラー

いくつかのケースでは、私が持っているC#のコードは、「真」のシリアル接続でうまく動作しますが、USB /シリアル接続に失敗します。データは、データの最初の部分(最初の1文字または2文字など)とそれ以外のもので断片化されます。

私はポートからのデータをピックアップしてcomport.ReadExistingなどの基本的なものを()を使用しています。これは問題の一部ですか?すべてのデータが単一の文字列で読み取られることを保証する他の方法はありますか?

は最後に、私はすでに、デバイスマネージャでUSB /シリアル設定のいくつかの周りプレイしたことを追加したいといい、オーレ」ハイパーターミナルを使用した場合のデータは、罰金に入っています。 。 。だから、それはコード内の何かでなければならない。

+0

受信したデータにプロトコルが含まれていると思われますか?これは、改行で終了した文字列や固定量のデータなどの単純なものになります。 – dbasnett

+0

DataReceivedイベントを正しく使用している場合は、正常であるはずです。コードを見ることが役に立ちます。 – dbasnett

答えて

2

データは、Windowsがそれについて知っていない長い時間のためにUSBデバイスに座ることができますので、あなたは、あなたの受信タイムアウトを設定しなければなりません。実際のシリアルポートは、Windowsドライバが表示できる16550 FIFOのデータを保持します。

+0

すでに、20000(つまり20秒)に設定されているcomport.ReadTimeoutを参照していると仮定していますか? –

+0

@Jim:Win32 APIには、最初の文字までのタイムアウト、文字間のタイムアウト、および合計タイムアウトがあります。 .NET SerialPortクラスがそれらのすべてを提供するかどうかは不明です。 Win32シリアルポートAPIの周りに自分自身のラッパー(C++/CLIで)を作ったのはとても苦しいものでした。 –

+0

文字間のタイムアウトは、私がいくつかのデータを取得しているので、右の行に沿ったように聞こえるが、すべてではない。しかし、ほとんどのハードウェア構成でうまく動作するので、.NETライブラリを使用することに多大な投資をしています。問題のあるUSB /シリアル接続だけです –

1

あなたはSerialPort.DataReceivedイベント(http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived.aspx)を使用したい時間のほとんどは。

これは、文字列の一部を受け取ることができるので手動でデータのまとまりを結合する必要がありますが、単一のレコードの境界を検出すると、そのレコードを処理してIOがさらにイベントを受け取ることができます。

これはあなたのスレッドをブロックしませんいくつかの非同期IOができますので、一般的にデータのより効率的に処理することができます。あなたの特定の状況に役立ちますが、それは私にはわかりませんが、過去にデータの読書問題、低速、スレッドプーリング、ロックアップを処理するのに役立ちました。 USBシリアルコンバータと

+0

私はすでにそのイベントを使用しています。これは、バッファをクリアするために*仮定されているcomport.ReadExistingを使用している場所ですが、再びデータの端数を取得しています。 –

+0

ああ、ありがとうございます。 Nevermind then ;-) –

関連する問題