Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:串行端口类和线程_C#_Multithreading_Serial Port - Fatal编程技术网

C#:串行端口类和线程

C#:串行端口类和线程,c#,multithreading,serial-port,C#,Multithreading,Serial Port,目前,我正在使用SerialPort类与我的设备通信。为了改善用户体验,我创建了一个线程,可以终止正在进行的通信。但是,当我在一个线程中启动下面的代码时,我将从(SerialPort)port_389;接收到的数据实际上与我在写指令中使用的数据相同(看起来我无法区分读写缓冲区)。如果我不将代码放在新线程中,代码就会工作。那么为什么会发生这种情况,我一次只能有一个通信,所以不可能同时在缓冲区中写入两个命令 commTmr是一个计时器,它将在一定时间后停止while循环 Sleep是为了确保接收到的

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