上位机如何实现遍历所有串口?
因为USB转串口虚拟出来的com可能不是固定的一个COM,有时是COM5,有时是COM6...COM10等,现在上位机打算遍历每个COM发一些指令,有返回所需要的指令则判定此串口为正解的串口,现在问题是如果是不存在的COM口,则会出错用的是MSCOMM控件
m_Comm.SetCommPort(change_com);//选择要遍历的COM,此函数如果电脑上没有此COM,则会出错
m_Comm.SetInBufferSize(1024);//设置输入缓冲区的大小,单位为Byte
m_Comm.SetOutBufferSize(512);//设置输出缓冲区的大小,单位为Byte
if(!m_Comm.GetPortOpen())//打开串口
m_Comm.SetPortOpen(TRUE);
m_Comm.SetInputMode(1);
m_Comm.SetSettings("38400,n,8,1");
m_Comm.SetRThreshold(1);
m_Comm.SetInputLen(0);
这里!!m_Comm.SetCommPort(change_com);//选择要遍历的COM,此函数如果电脑上没有此COM,则会出错
比如电脑上没有COM6这口,但程序里要遍历1-10的COM口,此时m_Comm.SetCommPort(6);,这时会出错了,
不知MSCOMM控件有没有办法能得到假如没有此COM口,所返回数据,我能判断出没COM口,则我直接遍历下一个COM口呢? 为什么要遍历所有呢?查找注_册表看看系统当前有几个串口,只需要查询这几个就可以了 c#
string[] com_array = System.IO.Ports.SerialPort.GetPortNames(); 回复【楼主位】figoxwm
-----------------------------------------------------------------------
for (int i = 0; i < 256; i++)
{
// 在这里尝试打开串口
CreateFile(...)
} 看了1楼回复,问了一下古哥,说是在这里可以找到:HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM int CCONTROLDlg::EnumComport()
{
unsigned int i;
HKEY hKey;
LPCTSTR data_Set="HARDWARE\\DEVICEMAP\\SERIALCOMM\\";
long ret0 = (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_READ, &hKey));
if(ret0 != ERROR_SUCCESS){return -1;}
CHAR Name={0};
UCHAR szPortName={0};
LONG Status={0};
DWORD dwIndex=0;
DWORD dwName={0};
DWORD dwSizeofPortName=sizeof(szPortName);
DWORD Type={0};
dwName = sizeof(Name);
dwSizeofPortName = sizeof(szPortName);
CHAR achClass = "";// buffer for class name
DWORD cchClassName = MAX_PATH;// length of class string
DWORD cSubKeys; // number of subkeys
DWORD cbMaxSubKey; // longest subkey size
DWORD cchMaxClass; // longest class string
DWORD cValues; // number of values for key
DWORD cchMaxValue; // longest value name
DWORD cbMaxValueData; // longest value data
DWORD cbSecurityDescriptor; // size of security descriptor
FILETIME ftLastWriteTime; // last write time
RegQueryInfoKey(hKey, // key handle
achClass, // buffer for class name
&cchClassName, // length of class string
NULL, // reserved
&cSubKeys, // number of subkeys
&cbMaxSubKey, // longest subkey size
&cchMaxClass, // longest class string
&cValues, // number of values for this key
&cchMaxValue, // longest value name
&cbMaxValueData, // longest value data
&cbSecurityDescriptor, // security descriptor
&ftLastWriteTime); // last write time
for(i=0;i<cValues;i++)
{
Name = '\0';;
dwName = 25;
Status = RegEnumValue (hKey,
i,
Name,
&dwName,
NULL,
&Type,
szPortName,
&dwSizeofPortName );
if((Status == ERROR_SUCCESS)||(Status == ERROR_MORE_DATA))
{
m_Port.AddString(CString(szPortName));
}
}
RegCloseKey(hKey);
int nCount = m_Port.GetCount();
if (nCount > 0)
m_Port.SetCurSel(0);
return i;
} 刚好用到 谢谢 瞧瞧 www.naughter.com/enumser.html mark 用了,很好 C#
RegistryKey RootKey = Registry.LocalMachine;
RegistryKey Comkey = RootKey.OpenSubKey(@"HARDWARE\DEVICEMAP\SERIALCOMM");
String[] ComNames = Comkey.GetValueNames();
foreach ( String ComNamekey in ComNames)
{
string TemS = Comkey.GetValue(ComNamekey).ToString();
ComName.Items.Add(TemS);
} C#
try {
foreach (string com in System.IO.Ports.SerialPort.GetPortNames())//自动获取串行口名称
this.cmb_COM.Items.Add(com);
this.cmb_COM.SelectedIndex = 0;
}
catch {
MessageBox.Show("没有发现串口!", this.Text);
} 最近一直在搞这方面的,先mark 给你传个用过的串口遍历程序,很好用,一个外国人写的。
串口遍历程序ourdev_599884QA2J9M.zip(文件大小:6K) (原文件名:EnumSerial.zip) 刚好用到。太给力了。哈哈。感谢
页:
[1]