您的位置:首页 > 数据 >
C++/MFC串口通信——光源控制器控制 全球新要闻
来源:CSDN 2023-01-05 13:26:24

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);}

关键词:
相关文章
山西拟确认17 座煤矿为二级安全生产标准化管理体系煤矿 观速讯

山西拟确认17 座煤矿为二级安全生产标准化管理体

  山西省应急管理厅1月3日消息,按照国家煤矿安监局《煤矿安全生产标准化管理体系考核定级办法(试行)》和《煤矿安全生产标准化管理体系基更多

2023-01-05 10:10:12
世界观察:统计局:12月下旬全国煤炭价格各有涨跌

世界观察:统计局:12月下旬全国煤炭价格各有涨跌

  国家统计局1月4日公布的数据显示,12月下旬全国煤炭价格各有涨跌。各煤种具体价格变化情况如下:  无烟煤(洗中块,挥发份&le;8%)价格2更多

2023-01-05 10:12:50
国家能源局核准新疆三个煤矿项目 产能合计600万吨/年

国家能源局核准新疆三个煤矿项目 产能合计600万

  近日,国家能源局核准新疆地区三个煤矿项目。  一是阿艾矿区北山中部150万吨年煤矿,项目建设单位为开滦库车高科能源有限公司,建设地点更多

2023-01-05 09:54:26
山西省应急管理厅为30 座煤矿(企业)颁发安全生产许可证|天天热讯

山西省应急管理厅为30 座煤矿(企业)颁发安全生

山西省应急管理厅关于颁发煤矿(企业)安全生产许可证的公告根据有关规定,经研究决定为山西煤炭进出口集团左权鑫顺煤业有限公司公司等30座煤更多

2023-01-05 10:08:08
保供进行时!这些能源企业多措并举保障人民温暖过冬

保供进行时!这些能源企业多措并举保障人民温暖过

  请各岗位人注意,各控制人员准备,准备开机生产!1月1日一大早,在国家能源集团神东煤炭上湾煤矿综采一队,随着工作人员一声指令,智能采更多

2023-01-05 10:10:17
天天热讯:新疆最大煤炭产销企业2022年煤炭销量达8005万吨

天天热讯:新疆最大煤炭产销企业2022年煤炭销量达8

  截至2022年12月31日,新疆最大煤炭产销企业——国家能源集团新疆能源有限责任公司2022年累计完成煤炭销量8005万吨,实现新突破。  2022更多

2023-01-05 09:02:49
12月下旬全国流通市场钢价涨跌互现|每日速读

12月下旬全国流通市场钢价涨跌互现|每日速读

  统计局最新数据显示,12月下旬,全国流通市场钢材价格涨跌互现。具体如下:  螺纹钢(&Phi;16-25mm,HRB400)价格为39926元吨,较上期(更多

2023-01-05 09:16:39
2022年瓦日铁路货运量达到1.03亿吨-百事通

2022年瓦日铁路货运量达到1.03亿吨-百事通

  3日从中国铁路太原局集团有限公司获悉,2022年,西煤东运大通道瓦日铁路货运量达到103亿吨,我国再增一条年运量过亿吨能源运输通道。  更多

2023-01-05 08:53:38
2022年鄂尔多斯煤炭销量首次突破8亿吨-天天速读

2022年鄂尔多斯煤炭销量首次突破8亿吨-天天速读

  内蒙古鄂尔多斯市能源局消息,2022年鄂尔多斯市煤炭销量预计达836亿吨,占全国五分之一,同比增加116亿吨,增幅达15%。  同时,鄂尔多斯更多

2023-01-04 10:12:22
辽宁省公布首批重要矿产资源矿产地68个-环球信息

辽宁省公布首批重要矿产资源矿产地68个-环球信息

  按照《辽宁省矿产资源总体规划(2021-2025年)》和相关标准,为加强全省重要矿产资源矿产地管理,日前,辽宁省自然资源厅组织有关单位和技更多

2023-01-04 10:13:19