2013-06-12 56 views
0

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

只有這個代碼可以做任何有意義的事情。它對時間非常敏感。您將調用Write()很多次,直到發送緩衝區填滿容量爲止。阻止寫一段時間給BytesToRead足夠大的時間。然後,你可能會*讀取某些內容,但它們可能不會讀取任何內容,因爲它們已經接收了太多的字節。然後忽略使用Sleep()修補的Read()返回值,不好主意。它應該如何工作完全不清楚。 –

+0

我循環Write()指令的原因是因爲我正在使用的設備經常不會讀取我的第一個Write()指令。這就是爲什麼我然後重新發送他的命令,直到它的an主。雖然你是對的,我不應該使用Thread.Sleep。 – OCOM

回答

1

documentation狀態:

任何實例成員不保證是線程安全的。

所以我的猜測是,如果你想使用多個線程,你將不得不使用例如同步它們。鎖定以確保它們不會同時訪問端口。

+0

謝謝,我使用了一個靜態SerialPort,現在它工作正常。 – OCOM