1.首先需要遍历注册表得到所有可用的串口

将得到的每一个串口保存到向量vector中,代码如下:

// 得到所有的串口号
vector<string> cnComm::getComPort()
{
HKEY hKey;
char portName[], commName[];
// 打开串口注册表对应的键值
if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Hardware\\DeviceMap\\SerialComm", NULL, KEY_READ, &hKey))
{
int i = ;
int mm = ;
DWORD dwLong, dwSize;
while (TRUE)
{
dwLong = dwSize = sizeof(portName);
// 枚举串口
if (ERROR_NO_MORE_ITEMS == ::RegEnumValue(hKey, i, portName, &dwLong, NULL, NULL, (PUCHAR)commName, &dwSize))
{
break;
}
comName.push_back(commName);
i++;
}
// 关闭注册表
RegCloseKey(hKey);
}
else
{
MessageBox(NULL,"您的计算机的注册表上没有HKEY_LOCAL_MACHINE:Hardware\\DeviceMap\\SerialComm项","警告",MB_OK);
}
// 返回串口号
return comName;
}

2.串口的自动识别

硬件开发时,就事先规定通信的协议,然后再依次将得到的串口号打开,向串口中写入事先规定好的字符,这里是“CHECKCONNECT”,如果没有得到事先规定的返回值,则通信失败,关闭串口,并打开下一个串口,如果得到规定的“OK”就代表通信成功,识别串口成功。详细的代码如下所示:

// 自动识别串口
bool cnComm::OnCommunicate()
{
int port_index;
// 遍历当前可用的串口号
for (int i = ; i < comName.size(); ++i)
{
cnComm();
// 初始化通信标志
IsCommflag = false;
// 得到串口号的ID,因为得到的是ASCII码,要将其转化到十进制
port_index = comName[i][comName[i].size() - ] - '';
// 依次打开可用的串口号
Open(port_index, "115200,n,8,1");
// 写入连接检查的数据
char* Data = "CHECKCONNECT";
Write((const char *)Data); // 开辟20个字节的地址,初始化为0
char p[] = { };
// 从缓冲区当中得到数据,首先要考虑延时的问题,所以这里睡眠100毫秒
Sleep();
char* aa = ReadString(p, , );
// 如果返回的数据中的前两个字节是“OK”,则表示通信成功
if (strncmp("OK", aa, ) == )
{
IsCommflag = true;
//MessageBox(NULL, "通信成功", "提示", MB_OK);
return true;
}
else // 否则通信不成功
{
IsCommflag = false;
// 关闭串口,同时也关闭关联线程
Close();
}
}
return IsCommflag;
}

最新文章

  1. 一些SQL
  2. mysql索引的一些知识
  3. 最小生成树算法——prim算法
  4. 拥抱 Android Studio 之五:Gradle 插件开发
  5. hdu 1515 Anagrams by Stack
  6. 计算机术语install和setup的区别
  7. Java语言基础(三) Java注释
  8. Java基础知识强化之集合框架笔记41:Set集合之HashSet存储自定义对象并遍历练习
  9. MyEclipse 2013 导入MyEclipse 9.0的EJB项目时,需要注意
  10. 转: 理解AngularJS中的依赖注入
  11. 解决:fatal error LNK1104: 无法打开文件“libc.lib”
  12. js中 函数声明/函数表达式/匿名函数/箭头函数/立即执行函数
  13. 小程序和PHP学习笔记 ----- 不定期更新。
  14. 2017-2018-20172309 『Java程序设计』课程 结对编程练习_四则运算_第三周
  15. [No0000100]正则表达式匹配解析过程分析(正则表达式匹配原理)&regexbuddy使用&正则优化
  16. 关于react16.4——上下文Context
  17. php代码收集
  18. UVM中的driver组件
  19. 如何查看ETW Trace?
  20. 【转】C# 二维码生成

热门文章

  1. Mac 10.13.6 安装 cocoapods
  2. Redis的使用原理
  3. android studio连接真机大概问题
  4. Linux创建用户与权限赋值
  5. 各种BUG
  6. A*搜索详解(1)——通往基地的最短路线
  7. python selenium-webdriver 元素操作之键盘操作(五)
  8. Spark配置参数详解
  9. TCP/IP 通信
  10. Azure CosmosDB (10) Azure Cosmos DB体系结构