2

同時に 2 つのシリアル ポートから読み取る C# プログラムがあります。シリアル ポート デバイスは、Prolific USD から 4 つのシリアル ポートへのアダプターで、2 つのハードウェアをアダプターの別々のポートに接続します。問題は、各ポートから一度に 1 つずつ読み取ると、すべて正常に動作しますが、両方のポートから同時に読み取ろうとすると、ポートの 1 つが応答しないことです。この問題をトラブルシューティングするために、アプリケーションの 2 つのインスタンスを開始し、一度に 2 つのポート (アプリケーションの各インスタンスから 1 つ) から読み取ることができました。1 つのアプリケーションで 2 つの別々のシリアル ポートから同時に読み取る方法を知っている人はいますか? ありがとうございました。

いくつかのコードを追加する:

ポート 1:

// ポート 1 からの読み取りを開始または停止するためのボタン。応答を読み取る前にハードウェアに書き込む必要があるため、書き込みはタイマーで行われます。

    private void buttonPort1_Click(object sender, EventArgs e)
    {
        if (buttonPort1.Text == "Start Recording")
        {
            if (!port1.IsOpen)
            {
                port1.Open();
            }
            timerPort1.Start();                
            buttonPort1.Text = "Stop Recording";
        }
        else
        {
            timerPort1.Stop();
            buttonPort1.Text = "Start Recording";
        }
    }

// 応答を受信するたびにハードウェアに「D」を書き込みます

    private void timerPort1_Tick(object sender, EventArgs e)
    {               
            port1.Write("D");
    }


void port1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        try
        {
            string result = port1.ReadLine();
            oneParamDelegate dg = PHandCondResult;  // send back the result to the main thread
            this.Invoke(dg, result);
        }
        catch
        {
        }

    }

ポート 2

2 番目のポートのコードは、実際には上記と似ていますが、異なるポート、データ受信イベント、およびタイマーが異なります。

Grant Thomas によって提案された複数のスレッド オプションを試してみます: シリアル ポートは既に別のスレッドで動作していると思っていたので、以前は試していませんでした: datareceived イベントはメイン スレッドをブロックせず、作成されたコントロールにアクセスできませんメイン スレッドで実行しますが、バックグラウンド ワーカーを使用して試してみて、後で元に戻します。迅速な対応ありがとうございました。

4

2 に答える 2

5

特にThreadingを読む必要があります。

たとえば、次のようなコードがあるとします。

ReadDataFromSomePort();
ReadDataFromSomeOtherPort();

次に、最初のものが同期的に実行され (ブロック)、次に後者が実行されます。これは、メイン アプリケーション スレッドである同じスレッドで発生します。UI をインタラクティブ/レスポンシブに保ちながら 1 つのことだけを行うなど、非同期的なことを行う場合は、作業を他のスレッドに委任する必要があります。

したがって、次のような結果になります。

var thread1 = new Thread(ReadDataFromSomePort);
var thread2 = new Thread(ReadDataFromSomeOtherPort);

thread1.Start();
thread2.Start();

これ以上のことはありますので、先に進む前に概念について調査することをお勧めします。

MSDN には、スレッド化に関するチュートリアル/プログラミング リファレンスがあります。

于 2013-04-22T12:45:14.467 に答える
1

両方に対して 2 つの異なるオブジェクトSerialPortと異なるDataReceivedイベントを作成すると、うまくいくはずです。

于 2013-04-22T12:44:57.493 に答える