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裡也沒有相關的資料。但後來偶然發現,原來辦法是很簡單的,只需要在初...