C 中如何安全的關閉串列埠

2021-06-22 22:25:33 字數 1694 閱讀 9288

vc#中如果涉及到多執行緒,特別是大量的資料處理和介面更新時,如果簡單強制的關閉串列埠,很可能會造成串列埠死掉,我1年來一直有個想法,今天終於真正找到了原因和解決的辦法。

串列埠無法關閉的原因是:要關閉串列埠的時候,有其它執行緒還在讀取資料或者更新介面。

關鍵是:在準備關閉串列埠的時候,看看是否在接收和處理資料,如果是就等它處理完為止;在事件處理的最前面,判斷如果是準備關閉串列埠的bool型別值,就不再進入資料接收和處理。

using system;

using system.collections.generic;

using system.text;

using system.io.ports;

using system.timers;

namespace porttesting

///

/// 有引數的建構函式

///

/// 串口號,如"com1"

/// 波特率,如19200

public portdatadisplay(string portname, int baudrate) 

///

/// 開始工作

///

public void connectdeveice()  }

///

/// 結束工作

///

public void disconnectdeveice() // 關鍵和核心!!!

serialport.close(); }

///

/// 當通知到有資料達到120時處理(讀取,與分析)

///

///

///

private void onserialportdatacome(object sender, serialdatareceivedeventargs e) 

m_isreceiving = true; // 關鍵!!!

try 

//read

datasrc = serialport.readexisting();//讀出緩衝區所有資料

if (datasrc != "" && this.whengetnew != null)  }

finally // 放在finally裡面比較好。  }

}}使用的時候:

using system;

using system.collections.generic;

using system.componentmodel;

using system.data;

using system.drawing;

using system.text;

using system.windows.forms;

namespace porttesting

private void btnopen_click(object sender, eventargs e)

else if (btnopen.text == "關閉串列埠")  }

///

/// 事件

///

private void portdispl_whengetnew() ;

try  }

catch  }

private void btnclear_click(object sender, eventargs e)  }

}

MFC中如何安全的建立和關閉執行緒

在mfc中安全的建立並關閉執行緒 someclass.h class someclass duplicatehandle getcurrentprocess m pcoolingthread m hthread,getcurrentprocess m hcoolingthreadbackup 0,f...

休眠 關閉串列埠輸出 C 開發串列埠通訊例項及串列埠基礎

序列介面 串列埠 是一種可以將接受來自cpu的並行資料字元轉換為連續的序列資料流傳送出去,同時可將接受的序列資料流轉換為並行的資料字元供給cpu的器件。一般完成這種功能的電路,我們稱為序列介面電路。串列埠通訊 serial communications 的概念非常簡單,串列埠按位 bit 傳送和接收...

C 中如何去除窗體預設的關閉按鈕

很多時候,在winform的設計下,會遇到新建窗體時不需要用到預設的關閉按鈕的情況,而是用另外設定關閉 button或其他控制項來控制窗體的關閉。之前我遇到這個問題時,問了很多朋友,都沒找到方法,vs的窗體屬性裡也沒那一項,在msdn裡也沒有相關的資料。但後來偶然發現,原來辦法是很簡單的,只需要在初...