目前,我正在使用SerialPort類與我的設備進行通信。爲了改善用戶體驗,我創建了一個可以終止正在進行的通信的線程。但是,當我在一個線程中啓動下面的一段代碼時,我將從(SerialPort)port_.Read指令接收到的數據實際上與我在Write指令中使用的數據相同(看起來我無法區分讀取和寫入緩衝區)。如果我不把它放在新的線程中,代碼將起作用。那麼爲什麼會發生這種情況,我只能在一次通信中進行通信,因此無法在同一時間將2個命令寫入緩衝區。C#:SerialPort類和線程
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);
}
只有這個代碼可以做任何有意義的事情。它對時間非常敏感。您將調用Write()很多次,直到發送緩衝區填滿容量爲止。阻止寫一段時間給BytesToRead足夠大的時間。然後,你可能會*讀取某些內容,但它們可能不會讀取任何內容,因爲它們已經接收了太多的字節。然後忽略使用Sleep()修補的Read()返回值,不好主意。它應該如何工作完全不清楚。 –
我循環Write()指令的原因是因爲我正在使用的設備經常不會讀取我的第一個Write()指令。這就是爲什麼我然後重新發送他的命令,直到它的an主。雖然你是對的,我不應該使用Thread.Sleep。 – OCOM