关于串口问题,急!急!急!
用下面的两个代码去扫描计算机上的串口,但是,只能扫描到连续的串口, 不能扫描到间断的。
如果计算机上有串口COM1、COM2、COM3,这是可以检测出来, 但是当我将COM3该为COM11时,
代码就不能将COM11检测出来, 这是怎么回事??? 急需求解。
这是用API来检测:
CString strCom;
int m_nSerialPortNum=0;// 串口数
CString strSerialList[256]; // 临时定义 30 个字符串组
int nCom;
HANDLE hCom;
for( nCom=1; nCom<256; nCom++ )
{
strCom.Format("COM%d", nCom);
hCom = CreateFile(strCom, GENERIC_READ|GENERIC_WRITE, 0, 0,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
if(INVALID_HANDLE_VALUE == hCom )
continue;
strSerialList[m_nSerialPortNum] = strCom;
// AfxMessageBox(strSerialList[m_nSerialPortNum]);
// m_ctrlCom.AddString(strSerialList[m_nSerialPortNum]);
// otherCom[other++] = nCom;
m_nSerialPortNum++;
CloseHandle(hCom);
}
这是扫描注册表,来检测计算机上的串口,但是只能检测到10(不包括10)一下的串口,同样也不能检测到修改后的串口:
CString strSerialList[256]; // 临时定义 256 个字符串组,因为系统最多也就 256 个
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;
}
int count = 0;
CHAR Name[25];
UCHAR szPortName[25];
LONG Status;
DWORD dwIndex = 0;
DWORD dwName;
DWORD dwSizeofPortName;
DWORD Type;
dwName = sizeof(Name);
dwSizeofPortName = sizeof(szPortName);
//遍历计算机所有串口
do
{
Status = RegEnumValue(hKey, dwIndex++, Name, &dwName, NULL, &Type,
szPortName, &dwSizeofPortName);
if((Status == ERROR_SUCCESS)||(Status == ERROR_MORE_DATA))
{
strSerialList[count] = CString(szPortName); // 串口字符串保存
//AfxMessageBox(strSerialList[count]);
count++;// 串口计数
}
} while((Status == ERROR_SUCCESS)||(Status == ERROR_MORE_DATA));
RegCloseKey(hKey);
有哪位大虾帮忙解决。。。。
[解决办法]
关于"\\\\.\\",MSDN上有说明的,查CreateFile就好了,关于打开串口,给你我原来的程序参考一下
//==================================================================================================
// 打开指定串口, 成功返回1, 失败返回0
//==================================================================================================
unsigned int OpenComm(int port, int baud)
{
char name[64];
CloseComm();
sprintf(name, "\\\\.\\COM%d", port);
m_comm = CreateFile(name, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if(m_comm == INVALID_HANDLE_VALUE)
{
return 0;
}
if(SetCommDCB(baud) && SetCommTime())
{
return 1;
}
return 0;
}
unsigned char m_valid_comm[100];
unsigned char m_comm_cnt = 0;
//==================================================================================================
// 查找有效的串口
//==================================================================================================
void SearchValidComm(void)
{
unsigned char port;
if(m_comm != INVALID_HANDLE_VALUE) return;
m_comm_cnt = 0;
for(port =1; port<=100; port++)
{
if(OpenComm((int)port, 9600) == 1)
{
m_valid_comm[m_comm_cnt++] = port;
CloseComm();
}
}
}