当前位置: 代码迷 >> VC/MFC >> 自动获取连接设备的串口,该如何处理
  详细解决方案

自动获取连接设备的串口,该如何处理

热度:175   发布时间:2016-05-02 03:42:16.0
自动获取连接设备的串口
近几天在看用Win API写串口程序,但是网上的大部分是指定串口打开,发送数据,我想写一个串口发送小程序,实现自动检测连接设备的串口号,该怎么做?感谢前辈们指导,谢谢,谢谢。

bool openport(char *portname)//打开串口
//int openport()
{
/*int nCom = 0;
int count = 1;
char portname[10];
memset(portname,0,10);*/

// do{

// nCom++;
// sprintf(portname,"COM%d",nCom);

hComm = CreateFile(portname,                      //串口号
   GENERIC_READ | GENERIC_WRITE,  //允许读写
   0,                             //通讯设备必须以独占方式打开
   0,                             //无安全属性
   OPEN_EXISTING,                 //通讯设备已存在
   FILE_FLAG_OVERLAPPED,          //异步IO
   0);

if(hComm == INVALID_HANDLE_VALUE)
{
// break;
// count++;
CloseHandle(hComm);
return FALSE;
}
else
return true;
// }while(1);

// return count;
}


我这样把程序改了改,但是仍然不行,求大神给支支招。。。
------解决思路----------------------
我在产品设计使用的方法:设置探测命令
PC端在与串口连接成功后,发送探测指令,超时未应答,就转向下一个口,直到收到设备的应答。
------解决思路----------------------
http://www.cnblogs.com/EdmundDwyane/p/3218838.htmlhttp://www.cnblogs.com/EdmundDwyane/p/3278641.htmlhttp://www.cnblogs.com/EdmundDwyane/p/3248297.html
看明白这三篇文章,套接字你就都懂了,含demo 
------解决思路----------------------
引用:
Quote: 引用:

我在产品设计使用的方法:设置探测命令
PC端在与串口连接成功后,发送探测指令,超时未应答,就转向下一个口,直到收到设备的应答。


串口还没打开,下位机怎么会应答?

比如:

if(ev==OpenOn) // 端口打开成功
{
state=S2;
SendSniff(); // 发探测指令
SetTimer(TI_RS232_SNIFF,TO_RS232_SNIFF,0);
}
if(ev==OpenErr) // 端口打开失败
{
m_comCode++; // 当前串口号增值
m_recevBuff.dataLen=0; // 清缓冲区
if(m_comCode>RS232_MAX_PORT)
m_comCode=1;
SetRS232Param(); // 只修改参数,不再创建线程
}

------解决思路----------------------
给你枚举串口的类  http://blog.csdn.net/sunnyloves/article/details/9167519
------解决思路----------------------
参考一下代码枚举串口
void FindCommPort(CComboBox *pComboBox)
{
HKEY   hKey;   
    
#ifdef   _DEBUG   
ASSERT(pComboBox != NULL);
pComboBox->AssertValid();   
#endif   
    
if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"Hardware\\DeviceMap\\SerialComm",
NULL,
KEY_READ,
&hKey ) == ERROR_SUCCESS)   //打开串口注册表   
{
int i=0;   
char portName[256],commName[256];   
DWORD dwLong,dwSize;   

CStringArray strCOM;
CByteArray bCOM;
strCOM.RemoveAll();
bCOM.RemoveAll();
bCOM.SetSize(256);
while(1)   
{
dwLong = dwSize = sizeof(portName);   
if(::RegEnumValue(hKey,
i,   
portName,   
&dwLong,   
NULL,   
NULL,   
(PUCHAR)commName,   
&dwSize) == ERROR_NO_MORE_ITEMS) //枚举串口
break;   

strCOM.Add(commName); //commName就是串口名字
i++;
}

if (strCOM.GetSize() == 0)
//if(pComboBox->GetCount()  == 0)
{
::AfxMessageBox("在HKEY_LOCAL_MACHINE:Hardware\\DeviceMap\\SerialComm里找不到串口!!!");
}

for (i = 1; i <= 255; i ++)
{
bCOM[i] = 0;
}

for (i = 0; i < strCOM.GetSize(); i ++)
{
BYTE nCOM = atoi(strCOM[i].Right(strCOM[i].GetLength() - 3));
bCOM[nCOM] = 1;
}

pComboBox->AddString(_T(""));
for (i = 1; i <= 255; i ++)
{
if (bCOM[i] == 1)
{
CString strAdd;
strAdd.Format(_T("COM%d"), i);
pComboBox->AddString(strAdd);
}
}

RegCloseKey(hKey);
}
}

void AddChannelCommPort(CComboBox *pComboBox, int nStart, int nEnd)
{
int nChannel;
CString strChannle;
for (int i = nStart; i <= nEnd; i++)
{
nChannel = i;
strChannle.Format(_T("%03d"), nChannel);
pComboBox->AddString(strChannle);
}
}
------解决思路----------------------
补充一下:CxDeviceFind与CxDeviceMapFind类的介绍
http://www.cnblogs.com/EdmundDwyane/p/3187226.html
  相关解决方案