0

目前,我正在使用 SerialPort 类与我的设备进行通信。为了改善用户体验,我创建了一个可以终止正在进行的通信的线程。但是,当我在线程中启动以下代码时,我将从 (SerialPort)port_.Read 指令接收到的数据实际上与我在 Write 指令中使用的数据相同(看起来我无法区分读写缓冲区)。如果我不把它放在一个新线程中,代码就可以工作。那么为什么会发生这种情况,我一次只能进行一次通信,因此无法同时将 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 回答