C++实现串口的自动识别
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;
}
C++实现串口的自动识别的更多相关文章
- 用VISA工具驱动继电器外设
1.驱动方式:TCP 2.开发过程 第一步:外设识别 TCP方式将继电器插上网线后,并不能像串口一样自动识别到这个外设,需要手动连接.打开NI MAX后,右击设备与接口,然后点击新建,双击VISA T ...
- 通过编写串口助手工具学习MFC过程——(九)自动识别串口的方法
通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...
- linux下USB串口,minicom
[一].驱动相关说明: 如果直接使用串口线,而没有用到USB转串口设备,就不需要安装驱动. 如果使用了USB转串口,一般情况下也不需要安装驱动了,目前linux系统已经包含了该驱动,可以自动识别,亦可 ...
- Victor 串口 VCL 控件 - 简单实用, 功能强大的 C++ Builder 串口控件!
源:Victor 串口 VCL 控件 - 简单实用, 功能强大的 C++ Builder 串口控件! 2014年02月06日发布控件的重要更新版本: Victor 串口控件 1.5.0.2 版本 (包 ...
- RS232串口的Windows编程纪要
再次是一篇入门文,各路神仙退散. 直接进入主题,又不是历史课,关于RS232那些前世今生的故事就不摆了. 硬件链接 首先以9针小口为例(大口应当只能去博物馆看了吧)看一下管脚排布,其实RS232本身没 ...
- 东芝 B-EV4 打印机 串口打印命令
最近在做项目时候使用了东芝的B-EV4打印机,在打印Excel时候由于字体太小,导致打印非常模糊.只能通过串口名称发送打印指令进行打印.在做项目的时候查了很多关于B-EV4打印机的资料,和打印命令.资 ...
- 推荐使用集串口,SSH远程登录和FTP传输三合一工具MobaXterm
在以前的资料里,串口和SSH远程登使用SecureCRT,window与ubuntu数据传输使用filezilla,窗口切换来切换去,麻烦也眼花缭乱.有没有一个工具搞定串口.SSH和FTP?有!它就是 ...
- qt 操作串口 QSerialPort
准备工作 *.pro中加入 QT += serialport 初始化 void MainWindow::initPort() { //读取串口信息 foreach (const QSerialPort ...
- SIM900A 通过RS232串口进行短信的发送。
一.基本数据 1.SIM900A模块支持RS232串口和LVTTL串口.保留了232口,在学习或者开发时可以监听51低端单片机和模块指令执行情况,能更快的找出原因,节省开发和学习的时间. 2.此模块供 ...
随机推荐
- python类的语法和底层实现
语法: class 类名: name = “egon” # 类属性 def __init__(self): self.age = 18 # 对象属性 self.__sex = "fe ...
- ANOVA-方差分析和单尾方差分析
https://www.cnblogs.com/webRobot/p/6877283.html https://blog.csdn.net/zijinmu69/article/details/8056 ...
- 评测parser的好坏
1.在dependency parsing中一般是用 LAS UAS 来衡量 简要说来UAS是知道是边对了(也就是它依赖的节点找对了)就算对,而LAS在前者的基础上要求更加严格,还要求边的Label也 ...
- 1. cocos creator 连接服务端
客户端向服务端发送 请求: this.network.send("/////",) 上面这段代码要写在logic.js中,(关于服务端的东西全部扔到logic中): ////中写 ...
- echarts数据区域缩放(鼠标滚轮、滚动条、拉选框)
当一个echarts图表上的数据很多时,想要查看部分区域的数据状态,可以通过数据区域缩放来实现,现总结三个方法: 鼠标滚轮缩放: var arr = []; for(var i = 0;i<15 ...
- angular6 引用echart第一次数据不显示解决
1 使用promise从后台返回数据后,页面还是比数据更快的加载出来,导致echart图页面加载的时候不显示问题 1.1 html <div echarts [options]="do ...
- tensorflow模型ckpt转pb以及其遇到的问题
使用tensorflow训练模型,ckpt作为tensorflow训练生成的模型,可以在tensorflow内部使用.但是如果想要永久保存,最好将其导出成pb的形式. tensorflow已经准备好c ...
- webbug3.0靶场第二关
由于是新手,当看见一个图片后一脸蒙比,查了一下才知道这原来叫做隐写术 看人家说破解图片隐写术用Stegsolve非常好用,然后查了一下kali软件仓库并没有找到Steegsolve这个软件,只能另想他 ...
- selenium_Python3_邮箱登录:动态元素定位
这里的关键是动态frame定位: 其他元素定位不用多说,常规操作. 不过需要注意加上这个: from selenium.webdriver.remote.webelement import WebEl ...
- js页面加载完成事件
jquery的一种简写形式: $(function(){ alert("页面加载完成!"); }); 其对应的完整形态为: $(document).ready(function( ...