private void RefreshCom() // 一個Bug:排序的方式是按照字符來,不是數字。所以會出現COM10排在COM4前面。但是問題解決:就是不排序,見程式!
{
cmbSerialPortIndex.Items.Clear();
cmbSerialPortIndex.Text = string.Empty;
string[] ports = Win32api_findSerialPorts.MulGetHardwareInfo(Win32api_findSerialPorts.HardwareEnum.Win32_PnPEntity, "Name"); // 使用WPI介面
if (ports != null)
{
string[] rebuildPorts = new string[ports.Length];
for (byte i = 0; i < ports.Length; i++) // 下面的我也感覺到也可以優化
{
for (byte j = 0; j < ports[i].Length; j++)
{
if ((ports[i][j] == '(')
&& ports[i][j + 1] == 'C'
&& (ports[i][j + 2] == 'O')
&& ports[i][j + 3] == 'M'
)
{
if (ports[i][j + 5] == ')') // (COMn) 形式
{
rebuildPorts[i] = "COM" + ports[i][j + 4] + " " + ports[i].Substring(0, j - 1);
}
else if (ports[i][j + 6] == ')') // (COMnn) 形式
{
rebuildPorts[i] = "COM" + ports[i][j + 4] + ports[i][j + 5] + " " + ports[i].Substring(0, j - 1);
}
else if (ports[i][j + 7] == ')') // (COMnnn) 形式
{
rebuildPorts[i] = "COM" + ports[i][j + 4] + +ports[i][j + 5] + ports[i][j + 6] + " " + ports[i].Substring(0, j - 1);
}
else if (ports[i][j + 8] == ')') // (COMnnnn) 形式
{
rebuildPorts[i] = "COM" + ports[i][j + 4] + ports[i][j + 5] + ports[i][j + 5] + ports[i][j + 7] + " " + ports[i].Substring(0, j - 1);
}
}
}
}
cmbSerialPortIndex.Items.AddRange(rebuildPorts);
cmbSerialPortIndex.SelectedIndex = cmbSerialPortIndex.Items.Count > 0 ? 0 : -1;
}
else // 幾乎不會出現這種錯誤
{
MessageBox.Show("尋找COM口出錯!");
cmbSerialPortIndex.Text = null;
}
}
/****************下面的函式:為了實作串口可以根據USB事件來檢測更新串口*******************/
public const int WM_DEVICECHANGE = 0x0219;//WM_DeviceChange
public enum WM_DEVICECHANGE_WPPARAMS
{
DBT_DEVICEARRIVAL = 0x8000,//DeviceArray
DBT_DEVICEREMOVECOMPLETE = 0x8004,//DeviceMoveComplete
};
protected override void WndProc(ref Message m)
{
try
{
if (m.Msg == WM_DEVICECHANGE)
{
switch ((WM_DEVICECHANGE_WPPARAMS)(m.WParam.ToInt32()))
{
case WM_DEVICECHANGE_WPPARAMS.DBT_DEVICEARRIVAL:
tmr_StrartRefreshCom.Enabled = Enabled;
break;
case WM_DEVICECHANGE_WPPARAMS.DBT_DEVICEREMOVECOMPLETE: //卸載
tmr_StrartRefreshCom.Enabled = Enabled;
break;
default:
break;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
base.WndProc(ref m);
}
當我要執行時,就不懂怎么會出現System.ArgumentNullException: 'Value cannot be null.
Parameter name: item'
我是用Visual studio 2019的。
uj5u.com熱心網友回復:
除錯下,看哪一行報錯,其中有變數引數為nulluj5u.com熱心網友回復:
除錯后 發現是:cmbSerialPortIndex.Items.AddRange(rebuildPorts); 報錯。
uj5u.com熱心網友回復:
可以幫我看下嗎?其實我不會C#的。謝謝你
uj5u.com熱心網友回復:
大家可以幫我看看嗎?本來不是很會c#轉載請註明出處,本文鏈接:https://www.uj5u.com/net/55438.html
標籤:C#
