同時に 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 イベントはメイン スレッドをブロックせず、作成されたコントロールにアクセスできませんメイン スレッドで実行しますが、バックグラウンド ワーカーを使用して試してみて、後で元に戻します。迅速な対応ありがとうございました。