C#:SerialPort类和线程

时间:2013-06-12 20:27:00

标签: c# multithreading serial-port

目前,我正在使用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);
}    

1 个答案:

答案 0 :(得分:1)

documentation州:

  

不保证所有实例成员都是线程安全的。

所以我的猜测是,如果你想使用多个线程,你将不得不使用例如同步它们来同步它们。锁定以确保它们不会同时访问端口。