C++/MFC串口通信——光源控制器控制
C++/MFC 串口通讯——光源控制器控制
一.背景1、平台 VS2010+MFC+64位编译平台+使用 Unicode 字符集 2、 字符、字word、字节byte、位bit (1)字符是指计算机中使用的字母、数字、字和符号。 (2)1word=2bytes=8bits (3)开发是在vs2010下做的,默认字符集编码是Unicode,但在之前的工程中,默认的字符集形式是多字节字符集。 CString属于所谓的宽字符集,一个字符占两个字节;char类型属于窄字符集,一个char字符占一个字节,所以它们之间的转换涉及到字节大小的转换。CString默认采用unicode编码,而char采用ansi编码,两种编码中单个字符占的存储大小也是不同的。 假设正常COM接收的数据为:23 33 31… 如果直接用Cstring,接收到的数据为23 00 33 00… 需要进行转化:UniCode 下 CString 转 char* 的方法
(资料图片)
3、光源控制器的硬件规范&数据格式(帧格式)
波特率数据长度停止位奇偶校验
9600 bps8 bits1 bit无
1字节1字节1字节3字节2字节
特征字命令字通道字数据异或和校验字
(1)特征字 = # (2)命令字 = 1,2,3,4,分别定义为:打开对应通道亮度,关闭对应通道亮度,设置对应通道亮度参数,读出对应通道亮度参数。 当命令字为1,2,3时,如控制器接收命令成功,则返回特征字$;如控制器接收命令失败,则返回&。 当命令字为4时,如控制器接收命令成功,则返回对应通道的亮度设置参数(返回格式跟发送格式相同);如控制器接收命令失败,则返回&。 (3) 通道字 = 1,2,3,4。分别代表4个输出通道。 (4)数据 = 0XX(XX=00~FF内的任一数值),对应通道电源的设置参数,转化为十进制为0~255。 (5)异或和校验字 = 除校验字外的字节(包括:特征字,命令字,通道字和数据)的异或校验和 4、串口通信常用API
二.程序1、定义全局变量
HANDLE hcom1;//光源所在串口OVERLAPPED m_osRead;// 用于重叠读OVERLAPPED m_osWrite;// 用于重叠写bool Open_ComPort1,light1_OpenOrClose=false;//是否成功打开串口,是否打开光源
2、串口初始化
hcom1 = CreateFile(L"COM2",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING ,FILE_ATTRIBUTE_NORMAL,NULL);if (hcom1 == INVALID_HANDLE_VALUE){MessageBox(_T("打开串口失败!"));Open_ComPort1=false;}else{DCB dcb;GetCommState(hcom1,&dcb);dcb.BaudRate = 9600;//波特率dcb.ByteSize = 8;//数据长度dcb.Parity = 0;//无奇偶校验位dcb.StopBits = 0;//停止位,0代表1,1代表1.5,2代表2SetCommState(hcom1,&dcb);Open_ComPort1=true;}
3、串口通讯函数
//发送指令并读取返回值,SendData(createStr(3,1,50)),指令字为4时更新显示框bool C光源控制Dlg::SendData(CString data){//初始化缓冲区中的信息PurgeComm(hcom1, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);//清空缓冲区//发送指令BYTE reciveBuf[20];DWORD readLen=0;USES_CONVERSION;char* cstr = T2A(data);if(WriteSerial(cstr,8)<=0){MessageBox(_T("串口指令发送失败!"));return false;}//接收反馈Sleep(100);int c=0;for( c=0;c<10;c++){int getrecivelength="getBufferLength();if(getReciveLength">0){readBufferLength=ReadSerial(reciveBuf,getBufferLength());if(readBufferLength==1)//只有1个,代表命令字为1、2、3{if(reciveBuf[0]=="#"){return true;}else{MessageBox(_T("光源控制器指令接收失败!"));return false;}}else//多个代表命令4,读取亮度值{int l=0;if(reciveBuf[0]=="#"){CString strValue=_T("00"),strValueTemp;strValue.Format(_T("%c%c"),reciveBuf[4],reciveBuf[5]);//16进制化成10进制BYTE decValue=(BYTE)(conHexStrToByte((char)strValue[0])*16+conHexStrToByte((char)strValue[1]));CString byte2cstring_temp;byte2cstring_temp.Format(_T("%s"),decValue);SetDlgItemText(IDC_EDIT_LightNum1,byte2cstring_temp);UpdateData(false);}else{MessageBox(_T("光源控制器反馈的数据格式错误!"));return false;}}break;}Sleep(15);}if(c>=10){MessageBox(_T("读取光源控制器反馈超时!"));return false;}return true;}//输入命令字、通道和亮度值(3,1,50修改通道1亮度->50),输出命令语句# 3 1 032 17CString C光源控制Dlg::createStr(BYTE command,BYTE channle,BYTE data){char *conHex =new char[3];CString returnStr=_T("#"),temp,temp2; //将第1通道亮度设为50,则以ASCII码向下写“#3103217”//+命令字temp.Format(_T("%d"),command);returnStr+=temp;//+通道temp.Format(_T("%d"),channle);returnStr+=temp;//+亮度值if(data>15){sprintf(conHex, "0%X", data);//十进制转十六进制}else{sprintf(conHex, "00%X", data);}temp2=conHex;returnStr=returnStr+temp2;//把所有的字符异或运算,+异或和校验字int i;BYTE xorData=returnStr[0];for(i=1;i="0" &&str<="9"){return str-48;}else if(str=="a"||str=="A"){return 10;}else if(str=="b"||str=="B"){return 11;}else if(str=="c"||str=="C"){return 12;}else if(str=="d"||str=="D"){return 13;}else if(str=="e"||str=="E"){return 14;}else if(str=="f"||str=="F"){return 15;}return 0;}
4、控制指令
//开关光源if (light1_OpenOrClose)//开>>关{if (SendData(createStr(2,1,255)))//已经关了{light1_OpenOrClose=false;GetDlgItem(IDC_EDIT_LightNum1)->EnableWindow(FALSE);GetDlgItem(IDC_SPIN_LightNum1)->EnableWindow(FALSE);}else{GetDlgItem(IDC_EDIT_LightNum1)->EnableWindow(TRUE);GetDlgItem(IDC_SPIN_LightNum1)->EnableWindow(TRUE);}} else//关>>开{if (SendData(createStr(1,1,255))){light1_OpenOrClose=true;SendData(createStr(4,1,0));//打开光源,更新参数GetDlgItem(IDC_EDIT_LightNum1)->EnableWindow(TRUE);GetDlgItem(IDC_SPIN_LightNum1)->EnableWindow(TRUE);}else{GetDlgItem(IDC_EDIT_LightNum1)->EnableWindow(FALSE);GetDlgItem(IDC_SPIN_LightNum1)->EnableWindow(FALSE);}}//文本框输入亮度+回车确认BOOL C光源控制Dlg::PreTranslateMessage(MSG* pMsg){// TODO: 在此添加专用代码和/或调用基类if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN){if (GetFocus()->GetDlgCtrlID() == IDC_EDIT_LightNum1)//按下回车,如果当前焦点是在自己期望的控件上{int b=_ttoi(m_LightNum1);SendData(createStr(3,1,b));}return TRUE;}if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE)return TRUE;return CDialogEx::PreTranslateMessage(pMsg);}
标签:
相关推荐:
最新新闻:
- Word转PDF用什么软件?全能PDF转换助手-全球观点
- 数控铣床法兰克系统代码完整版 数控铣床法兰克系统代码大全
- 环球观天下!华为P50有哪些配置?华为P50参数配置介绍
- 天天安卓模拟器是什么?安卓模拟器电脑版下载
- 即时焦点:一文读懂程序化交易、算法交易、量化投资、高频交易
- 重磅!2022年第四届全国高校计算机能力挑战赛决赛晋级公示:世界看热讯
- 魔兽世界怀旧服:炼金术(350)技术介绍
- 环球报道:java基础知识:标签和target的属性
- C++/MFC串口通信——光源控制器控制
- Linux下常见的锁机制-自旋锁 自旋锁spinlock见解
- 奖学金名称都有哪些?奖学金名称中英文对照表:焦点短讯
- 小米手机如何刷机?小米手机刷机教程步骤
- 打印机硒鼓的寿命一般多久?硒鼓多久换一次?
- 开机后桌面显示慢怎么办? 电脑桌面刷新很慢解决方法
- PSAM部分的硬件设计 PSAM部分的硬件设计图
- 双通道内存有什么好处?双通道内存好处介绍
- 天天滚动:梅西C罗姆巴佩等众星发文缅怀球王:安息吧!贝利
- 环球快看点丨什么是静电耳机? 静电耳机和普通耳机什么区别?
- 库尔勒经济开发区:电子政务“一站式”服务平台 焦点速看
- cmake-3.19.6-Linux自解压程序 简单的自解压程序|天天动态
- 被覆盖的文件如何恢复?不小心把文件覆盖了怎么恢复?
- 防火墙ddos防御设置 windows防火墙ddos
- 当前快播:配置文件中文乱码怎么解决?访问多个配置文件的的处理
- IE浏览器在电脑哪里?查找IE浏览器的方法
- 环球微速讯:苹果系统MAC地址查询方法有哪些?如何查询?
- 图书馆客流统计计数器的作用是什么?图书馆安装客流统计系统有哪些意义?:焦点热议
- 清空浏览器缓存怎么操作?清理浏览器历史浏览记录方法
- 全球动态:电脑蓝牙管理软件工具有哪些?好用的蓝牙管理工具推荐
- 日本政府奖励民众搬出东京:每个孩子补助100万日元
- 两寸证件照尺寸是多少?二寸证件照快速制作步骤
- View、Control、Layer对象的布局方法 今日热闻
- 图省事、紧裤腰,65亿用户规模,影视OST怎么失灵了?|全球观点
- 如何设置开机u盘启动?开机优先启动u盘
- 《重型建筑工》steam页面上线 支持简体中文-天天热资讯
- kdh是什么文件?kdh文件怎么转换成word文件
- 《潜行者2》新截图发布 多人模式发售后免费更新-每日视点
- 天天资讯:Konami:2023年将会公布更多游戏
- 任天堂欧服eShop开启新年折扣 多款大作参与活动_当前消息
- 环球简讯:《最后的生还者》剧集新剧照 乔尔和女儿莎拉登场
- 什么是dns服务器?设置DNS提升网速方法
- 云手机是什么东西?云手机用途
- 手机没有信号无服务是怎么回事?手机没信号解决思路
- 电脑虚拟内存不足怎么解决?教你彻底清理C盘垃圾
- 打印机墨水怎么加?佳能型号打印机加墨水教程
- 固态硬盘怎么安装?固态硬盘安装后需要怎么设置?
- 摄像机像素和分辨率区别是什么?摄像机像素和分辨率区别介绍
- 主板温度多少算正常? 主板温度高怎么办?
- 联想最新笔记本系统如何恢复?一键还原的使用方法
- 来了!《潜行者2:切尔诺贝利之心》首个实机演示公开 2023年发售-焦点速讯
- Xbox金会员1月会免游戏公布 《彩虹坠入》等入库|今日观点
- 世界今亮点!新概念墨水屏智能设备!科大讯飞发布讯飞有声书
- 环球通讯!联想小新Pro 16锐龙版预售 到手价5499元
- 世界聚焦:Steam发布2022年度最畅销游戏《永劫无间》获奖
- 《死亡空间:重制版》典藏版附赠艾萨克发光头盔
- 微星泰坦 GT77 旗舰游戏本将于CES 2023发布 屏幕成最大亮一-天天速看料
- 可惜了!曝Switch Pro被任天堂内部取消 当前短讯
- 观速讯丨苹果Mini-LED显示屏供应商表示需求萎缩 因有传言称未来将过渡到OLED
- 世界微速讯:约5577元!英伟达RTX 4070 Ti国外售价曝光
- 当前热点-3799元!Minisforum NAD9迷你主机开启预售:i9-12900H加持
- 天天报道:英国周销榜:《FIFA23》第一、《马里奥赛车8豪华版》重归前五
- 《无尽战区》复活将首发32名英雄 尝试增加付费内容
- Epic喜加二:《耻辱》《Eximius:夺取前线》免费领:天天要闻
- 《潜行者2:切尔诺贝利之心》新预告片“来找我”
- 玩家们也起诉微软 以阻止其收购动视暴雪:重点聚焦
- 《糖豆人》联动《魔法满屋》服装表情限时开售-新视野
- 因被网红挑衅嘲讽 瑞典环保少女爆粗口回怼_播资讯
- 天天热资讯!《星空》在韩提交商标申请 快公布发售日!
- 外媒猜测:《生化4重制版》或许比前两代重制改变更大
- 基金业“元老”丁楹:明年超配中国股票,加大定增投资,关注通胀走向
- 1272亿!茅台顺利完成全年营收目标 净利润同比增逾19%
- 【天天热闻】3人同时订酒店同房型价格差1倍 女子怒斥:看人叫价
- 今日热讯:高玩分享《战神:诸神黄昏》战斗剪辑:13秒击杀女武神王葛娜
- 【世界播资讯】2022年VR/AR设备全球出货量同比降12% Meta开局不利
- 当前通讯!抢不到的Paxlovid:医保支付价降至1890元,辉瑞称积极提升可及性
- 环球时讯:麦当劳首家“非人类运营”餐厅开业