c#: SerialPort类和线程

本文关键字:线程 SerialPort | 更新日期: 2023-09-27 18:18:11

目前,我正在使用SerialPort类与我的设备进行通信。为了改善用户体验,我创建了一个可以终止正在进行的通信的线程。但是,当我在线程中启动以下代码片段时,我将从(SerialPort)port_接收数据。读指令实际上是我在写指令中使用的相同数据(看起来我无法区分读和写缓冲区)。代码工作,如果我不把它放在一个新的线程。那么为什么会发生这种情况呢?我一次只能有一个通信,所以不可能同时在缓冲区中写入两个命令。

commTmr是一个计时器,它将在一定时间后停止while循环。

线程。睡眠是为了确保接收到的数据可以在缓冲区中读取(没有它我就无法读取)

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);
}    

c#: SerialPort类和线程

文档说明:

不能保证任何实例成员都是线程安全的。

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