VSMFC 入门编程七基于MSCOMM32OCX控件的串口编程Word文档下载推荐.docx
《VSMFC 入门编程七基于MSCOMM32OCX控件的串口编程Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《VSMFC 入门编程七基于MSCOMM32OCX控件的串口编程Word文档下载推荐.docx(5页珍藏版)》请在冰豆网上搜索。
![VSMFC 入门编程七基于MSCOMM32OCX控件的串口编程Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2023-1/9/b3364213-baad-4038-b5b0-d62c3e88bb30/b3364213-baad-4038-b5b0-d62c3e88bb301.gif)
发送编辑框和接受编辑框
添加通信串口控件,在对话框上右键
在对话框右下角电话样子的就是串口通信控件
给控件添加变量
在电话图标上右击:
命名如图示,点击完成在工程中会自动生成mscomm.h和mscomm.cpp两个文件;
给两个编辑框添加成员变量
添加三个按钮的事件
直接双击三个按钮会在程序中自动添加如下函数
[cpp]viewplaincopyprint?
voidCCommTestDlg:
:
OnBnClickedButtonSend(){//TODO:
在此添加控件通知处理程序代码}
OnBnClickedButtonOpen(){//TODO:
OnBnClickedButtonClose(){//TODO:
添加控件事件处理函数:
点击添加编辑即可,在CommTestDlg.cpp中会生成函数:
OnCommMscomm1(){//TODO:
在此处添加消息处理程序代码}
数据接收都是从这个函数处理
打开串口函数实现:
在此添加控件通知处理程序代码if(m_mscomm.get_PortOpen()){m_mscomm.put_PortOpen(FALSE);
}m_mscomm.put_CommPort(3);
//选择COM3m_mscomm.put_InBufferSize(1024);
//接收缓冲区m_mscomm.put_OutBufferSize(1024);
//发送缓冲区m_mscomm.put_InputLen(0);
//设置当前接收区数据长度为0,表示全部读取m_mscomm.put_InputMode
(1);
//以二进制方式读写数据m_mscomm.put_RThreshold
(1);
//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnCommm_mscomm.put_Settings(_T("
9600,n,8,1"
));
//波特率9600无检验位,8个数据位,1个停止位if(!
m_mscomm.get_PortOpen())//如果串口没有打开则打开{m_mscomm.put_PortOpen(TRUE);
//打开串口AfxMessageBox(_T("
串口3打开成功"
}else{m_mscomm.put_OutBufferCount(0);
AfxMessageBox(_T("
串口3打开失败"
}}关闭按钮实现:
在此添加控件通知处理程序代码m_mscomm.put_PortOpen(FALSE);
//关闭串口AfxMessageBox(_T("
串口3已关闭"
}发送代码实现:
在此添加控件通知处理程序代码UpdateData(true);
//读取编辑框内容m_mscomm.put_Output(COleVariant(m_EditSend));
//发送数据m_EditSend.Empty();
//发送后清空输入框UpdateData(false);
//更新编辑框内容}接受数据实现:
在此处添加消息处理程序代码staticunsignedintcnt=0;
VARIANTvariant_inp;
COleSafeArraysafearray_inp;
longlen,k;
unsignedintdata[1024]={0};
byterxdata[1024];
//设置BYTE数组CStringstrtemp;
if(m_mscomm.get_CommEvent()==2)//值为2表示接收缓冲区内有字符{cnt++;
variant_inp=m_mscomm.get_Input();
//读缓冲区消息safearray_inp=variant_inp;
///变量转换len=safearray_inp.GetOneDimSize();
//得到有效的数据长度for(k=0;
k&
lt;
len;
k++){safearray_inp.GetElement(&
amp;
k,rxdata+k);
}for(k=0;
k++)//将数组转换为CString型变量{strtemp.Format(_T("
%c"
),*(rxdata+k));
m_EditReceive+=strtemp;
CStringtemp=_T("
\r\n"
);
//换行m_EditReceive+=temp;
}}UpdateData(FALSE);
//更新编辑框内容}//接收到的数据存放在
//byte型数组rxdata[1024]中,再进行进一步处理,此处只是
//以16进制显示出来
//说明(自己的理解):
上面是基于事件驱动型的串口通信方式,感觉事件驱动与中断类似,但
//绝对不是中断,每一次响应事件的时候接收缓冲区的数据的长度不是固定的。
例如:
我的下
//位机发送了10个BYTE的数据,第一次上位机响应的时候只接收到8个,第二次响应时接收
//到另外两个。
并不是每收到一个数据就响应一次。
下图是测试结果收到的是a,b......显示的是数字码;
特被注意的是这样编程并不是所有的电脑都会兼容MSCOMM32.OCX,这时候就需要我们手动的在代码里面动态的注册MSCOMM32.OCX控件,函数的实现都是成APP函数开始,我们在APP函数的初始化函数中注册这个控件
实现代码:
BOOLCProgrammerApp:
InitInstance(){HINSTANCEh;
h=:
LoadLibrary(_T("
MSCOMM32.OCX"
FARPROCpFunc=:
GetProcAddress((HMODULE)h,"
DllRegisterServer"
if(pFunc==NULL){:
MessageBox(NULL,_T("
OCX控件加载失败!
"
),_T("
错误"
),MB_ICONERROR);
returnFALSE;
}pFunc();
......略}
解决不能发送oXoo的问题
上面不能实现0x00发送的原因是因为字符串本身就是以0x00默认作为结束符,所以在数据发送到0x00时候就会默认的发错而且大于127是负数,系统并不知道你是带符号还是不带符号上面的方法系统会默认带符号所以发送0x00或则大于127的数据就会发送错误。
下面是实现的方法
实现的方法是将需要发送的内容通过二进制发送
voidCProgrammerDlg:
TranSmitt(void){inti;
unsignedshortsum=0;
//计算校验和CByteArrayarray;
for(i=0;
i&
m_sendlength;
i++)//计算校验和{sum+=Txbufer[i];
}sum=sum^0xFFFF;
Txbufer[m_sendlength++]=(unsignedchar)(sum&
0x00FF);
Txbufer[m_sendlength++]=(unsignedchar)((sum&
0xFF00)&
gt;
&
8);
//存储校验和array.RemoveAll();
//清空数组array.SetSize(m_sendlength);
//设置数组大小为帧长度for(i=0;
i++)//把待发送数据存入数组{array.SetAt(i,Txbufer[i]);
}m_mscomm.put_Output(COleVariant(array));
}