簡體   English   中英

C#多線程和串行通信

[英]C# multiple threads and serial communication

今天,我遇到了一些奇怪的行為。 我有一個使用SerialPort類訪問的串行設備。 主應用程序具有一些計時器,該計時器每秒輪詢一次設備以獲取某些狀態更新。 在某個時候,我需要做一些耗時的工作,因此,我使用Backgroundworker不會阻塞GUI。 后台工作人員只需訪問一次即可訪問同一串行設備。 有時訪問有時無效。 經典的mutli-thread方案。 因此,我嘗試在將新命令發送到串行設備的函數上使用Mutex。

對於串行設備,我將所有內容放到了自己的類中。 在此類中,我具有sendCommand()函數,該函數將命令寫入設備,並使用AutoResetEventOnDataReceived Event等待答案。 sendCommand函數將一直阻塞,直到收到答案或超時為止。 然后,我在所有可能的出口上輸入sendCommand和releaseMutex時添加了Mutex 仍然無法正常工作。

有沒有更好的方法來解決這個問題?

謝謝托比亞斯

我有一個應用程序執行的操作完全相同-我所做的是創建了一個串行訪問類,並且無論何時(從GUI或我的一個后台線程)調用它,我都將擁有以下內容:

private void myFunction(SerialClass myserialobject) {
  if (myserialobject == null)
    return;
  lock (myserialobject) {
    // code accessing the serial object
    // ...
    // when finished, close the lock statement
  }
}

我在主線程和其他任何需要訪問的線程中都使用了它。 它正在阻止,但我認為這是一個阻止聲明。

另外,我沒有對OnDataReceived事件使用事件處理程序, OnDataReceived讓我的串行對象在寫入后執行阻塞讀取,這樣可以防止在錯誤的上下文中接收任何數據。 我不確定您的程序的設置如何精確,但是您可能要考慮這樣做。 如果您知道在寫入端口時希望讀取的字節數,則效果最佳。 這樣,您就不必使用Sleep來確保已讀取所有數據。

我通常要做的是循環運行串行讀/寫線程,並通過定時等待從BlockingQueue中讀取命令。 如果在超時時間內接收到串行請求對象,則線程將執行該對象;如果等待超時,則該線程將執行對串行設備的輪詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM