近几天在看用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
------解决思路----------------------
比如:
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