0

現在、SerialPort クラスを使用してデバイスと通信しています。ユーザー エクスペリエンスを向上させるために、進行中の通信を終了できるスレッドを作成します。ただし、スレッドで次のコードを開始すると、(SerialPort)port_.Read 命令から受け取るデータは、実際には、Write 命令で使用したデータと同じです (私には区別できないように見えます)。新しいスレッドに入れなければ、コードは機能します。では、なぜこのようなことが起こっているのでしょうか。一度に通信できるのは 1 つだけなので、同時に 2 つのコマンドをバッファーに書き込むことはできません。

commTmr は、一定時間後に while ループを停止するタイマーです。

Thread.Sleep は、受信したデータがバッファで読み取れることを確認することです(それなしで読み取るのに問題がありました)

while ((commTmr.timedout == false) && (port_.BytesToRead < threshold))
{
    if (commTmr.TimeElapsed().TotalSeconds > trigg)
    {
        port_.Write(sentData_, 0, nbBytesSend);
        trigg+=0.3;
    }

}

if (commTmr.timedout == true)
{
    return false;
}

else if (!(port_.BytesToRead < threshold))
{
    Thread.Sleep(100);
    port_.Read(receivedData_, 0, nbBytesRead);
}    
4

1 に答える 1

1

ドキュメントには次のように記載されています。

インスタンス メンバーは、スレッド セーフであるとは限りません。

したがって、複数のスレッドを使用する場合は、ロックなどを使用してそれらを同期し、同時にポートにアクセスしないようにする必要があると思います。

于 2013-06-12T20:42:10.073 に答える