C#:串行端口类和线程
目前,我正在使用SerialPort类与我的设备通信。为了改善用户体验,我创建了一个线程,可以终止正在进行的通信。但是,当我在一个线程中启动下面的代码时,我将从(SerialPort)port_389;接收到的数据实际上与我在写指令中使用的数据相同(看起来我无法区分读写缓冲区)。如果我不将代码放在新线程中,代码就会工作。那么为什么会发生这种情况,我一次只能有一个通信,所以不可能同时在缓冲区中写入两个命令 commTmr是一个计时器,它将在一定时间后停止while循环 Sleep是为了确保接收到的数据可以在缓冲区中读取(我在没有它的情况下很难读取)C#:串行端口类和线程,c#,multithreading,serial-port,C#,Multithreading,Serial Port,目前,我正在使用SerialPort类与我的设备通信。为了改善用户体验,我创建了一个线程,可以终止正在进行的通信。但是,当我在一个线程中启动下面的代码时,我将从(SerialPort)port_389;接收到的数据实际上与我在写指令中使用的数据相同(看起来我无法区分读写缓冲区)。如果我不将代码放在新线程中,代码就会工作。那么为什么会发生这种情况,我一次只能有一个通信,所以不可能同时在缓冲区中写入两个命令 commTmr是一个计时器,它将在一定时间后停止while循环 Sleep是为了确保接收到的
while((commTmr.timedout==false)和&(port.BytesToReadtrigg)
{
端口写入(sentData,0,nbBytesSend);
trigg+=0.3;
}
}
if(commTmr.timedout==true)
{
返回false;
}
else if(!(端口字节测试或读取<阈值))
{
睡眠(100);
端口读取(接收数据,0,nbBytesRead);
}
国家:
任何实例成员都不能保证线程安全
因此,我的猜测是,如果您想使用多个线程,您必须使用锁等方式对它们进行同步,以确保它们不会同时访问端口。在任何情况下,此代码都无法执行任何有意义的操作。它对时间非常敏感。您将多次调用Write(),直到传输缓冲区充满容量为止。阻塞写操作一段时间,让BytesToRead有足够的时间变得足够大。然后,您可能会读取一些内容,但很可能您不会读取任何内容,因为它们已经接收了太多字节。然后忽略Read()返回值bad idea,这是通过使用Sleep()修补的。我之所以循环Write()指令,是因为我使用的设备通常不会读取我的第一条Write()指令。这就是为什么我随后重新向他发送命令,直到命令发出。虽然你是对的,但我不应该使用Thread.Sleep.Thank,谢谢你,我使用了一个静态串行端口,现在它可以正常工作了。
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);
}