USB轉串列埠熱插拔檢測
上位機與裝置進行串列埠通訊之前都需要指定PC通訊的串列埠號,這無疑給操作上帶來不便,更痛苦的是每次都得到裝置管理器檢視當前連線的串列埠。
那麼如何通過程式碼獲取當前可用串列埠列表?一是通種登錄檔獲取,操作比較複雜;微軟為我們提供更簡單的方式,通過SerialPort.GetPortNames()方法獲取串列埠列表。使用時需要引用using System.IO.Ports;名字空間。程式碼如下:
///<summary>
/// 建構函式
///</summary>
public MainForm()
{
InitializeComponent();
GetSerialLstTbl();
}
///<summary>
/// 獲取串列埠列表
///</summary>
private void GetSerialLstTbl()
{
//清除comboBoxEx顯示
comboBoxExUartNum.Items.Clear();
//獲取串列埠列表
string[] serialLst = SerialPort.GetPortNames();
if (serialLst.Length > 0)
{
//取串列埠列表進行排序
Array.Sort(serialLst);
//將串列埠列表輸出到comboBoxEx
comboBoxExUartNum.Items.AddRange(serialLst);
comboBoxExUartNum.SelectedIndex = 0;
}
}
實現上述的前提是必需先插上串列埠再啟動軟體,那麼問題又來了,如果先啟動軟體再插上串列埠軟體並不能檢測出接入的串列埠。解決方法是捕獲裝置熱插拔時windows發出的訊息。
在主窗體中新增如下程式碼:
// 系統訊息常量
public const int WM_DEVICE_CHANGE = 0x219; //裝置改變
public const int DBT_DEVICEARRIVAL = 0x8000; //裝置插入
public const int DBT_DEVICE_REMOVE_COMPLETE = 0x8004; //裝置移除
//訊息處理
protected override void WndProc(ref Message m)
{
switch (m.Msg) //判斷訊息型別
{
case WM_DEVICE_CHANGE: //裝置改變訊息
{
GetSerialLstTbl(); //裝置改變時重新獲取串列埠列表
} break;
}
base.WndProc(ref m);
}
上述的實現方法還是比較粗略,因為只要是帶USB介面的裝置進行熱插拔都會重新獲取串列埠列。如果串列埠正在傳送或者接收時進行熱插拔,程式將丟擲異常.此時可以將串列埠先關閉再重新獲取串列埠列表.