VS2010/MFC 入门编程七(基于MSCOMM32.OCX控件的串口编程)
来源:互联网 发布:顺丰重货快运知乎 编辑:程序博客网 时间:2024/05/21 14:03
值得注意的是 第一种方法的发送方式是发送不了0X00的,第二种方法中解决啦0x 00不能发送的问题;
建立基于对话框的MFC工程,命名为“CommTest”,应用程序选择”基于对话框“
建立好工程如下图所示:
删除默认的按钮以及静态文本框,添加如下对话框控件:
A:打开串口控件,工具栏中拖一个botton 到 diadlg 上 ,并修改Caption 为 ”打开串口“,修改ID 为 IDC_BOTTON_OPEN
B: 关闭串口控件,工具栏中拖一个botton 到 diadlg 上 ,并修改Caption 为 ”关闭串口“,修改ID 为 IDC_BOTTON_CLOSE
C:发送控件,工具栏中拖一个botton 到 diadlg 上 ,并修改Caption 为 ”发送“,修改ID 为 IDC_BOTTON_SEND
D:发送编辑框 和 接受编辑框
添加通信串口控件,在对话框上右键
在对话框右下角电话样子的就是串口通信控件
给控件添加变量
在电话图标上右击:
命名如图示,点击完成 在工程中会自动生成mscomm.h 和mscomm.cpp两个文件;
给两个编辑框添加成员变量
添加三个按钮的事件
直接双击 三个按钮 会在程序中自动添加如下函数
void CCommTestDlg::OnBnClickedButtonSend(){// TODO: 在此添加控件通知处理程序代码}
void CCommTestDlg::OnBnClickedButtonOpen(){// TODO: 在此添加控件通知处理程序代码}
void CCommTestDlg::OnBnClickedButtonClose(){// TODO: 在此添加控件通知处理程序代码}
添加控件事件处理函数:
点击添加编辑即可,在CommTestDlg.cpp中会生成函数:
void CCommTestDlg::OnCommMscomm1(){// TODO: 在此处添加消息处理程序代码}
数据接收都是从这个函数处理
打开串口函数实现:
void CCommTestDlg::OnBnClickedButtonOpen(){// 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打开失败"));}}
关闭按钮实现:
void CCommTestDlg::OnBnClickedButtonClose(){// TODO: 在此添加控件通知处理程序代码m_mscomm.put_PortOpen(FALSE);//关闭串口AfxMessageBox(_T("串口 3 已关闭"));}
发送代码实现:
void CCommTestDlg::OnBnClickedButtonSend(){// TODO: 在此添加控件通知处理程序代码UpdateData(true); //读取编辑框内容m_mscomm.put_Output(COleVariant(m_EditSend));//发送数据m_EditSend.Empty(); //发送后清空输入框UpdateData(false); //更新编辑框内容}
接受数据实现:
void CCommTestDlg::OnCommMscomm1(){// TODO: 在此处添加消息处理程序代码static unsigned int cnt=0;VARIANT variant_inp;COleSafeArray safearray_inp;long len,k;unsigned int data[1024]={0};byte rxdata[1024]; //设置 BYTE 数组CString strtemp;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<len;k++){safearray_inp.GetElement(&k,rxdata+k);}for(k=0;k<len;k++) //将数组转换为 CString 型变量{strtemp.Format(_T("%c"),*(rxdata+k));m_EditReceive+=strtemp;CString temp=_T("\r\n"); //换行m_EditReceive+=temp;}}UpdateData(FALSE); //更新编辑框内容}
//接收到的数据存放在
//byte 型数组 rxdata[1024]中,再进行进一步处理,此处只是
//以 16 进制显示出来
//说明(自己的理解):上面是基于事件驱动型的串口通信方式,感觉事件驱动与中断类似,但
//绝对不是中断,每一次响应事件的时候接收缓冲区的数据的长度不是固定的。例如:我的下
//位机发送了 10 个 BYTE 的数据,第一次上位机响应的时候只接收到 8 个,第二次响应时接收
//到另外两个。并不是每收到一个数据就响应一次。
下图是测试结果 收到的是a,b......显示的是数字码;
特被注意的是这样编程并不是所有的电脑都会兼容MSCOMM32.OCX,这时候就需要我们手动的在代码里面动态的注册MSCOMM32.OCX控件,函数的实现都是成APP函数开始 ,我们在APP函数的初始化函数中注册这个控件
实现代码:
BOOL CProgrammerApp::InitInstance(){HINSTANCE h; h = ::LoadLibrary(_T("MSCOMM32.OCX")); FARPROC pFunc = ::GetProcAddress((HMODULE)h,"DllRegisterServer"); if (pFunc==NULL) { ::MessageBox(NULL,_T("OCX控件加载失败!"),_T("错误"),MB_ICONERROR); return FALSE; } pFunc(); ...... 略}
解决不能发送oXoo 的问题
上面不能实现0x00发送的原因是因为字符串本身就是以0x00默认作为结束符,所以在数据发送到0x00时候就会默认的发错 而且 大于127是负数 ,系统并不知道你是带符号还是不带符号 上面的方法系统会默认带符号 所以发送0x00或则大于127的数据就会发送错误。
下面是实现的方法
实现的方法是 将需要发送的内容通过二进制发送
void CProgrammerDlg::TranSmitt(void){int i;unsigned short sum = 0; //计算校验和 CByteArray array; for(i=0; i< m_sendlength; i++) //计算校验和{sum += Txbufer[i];}sum =sum^0xFFFF;Txbufer[m_sendlength++] = (unsigned char)(sum&0x00FF);Txbufer[m_sendlength++] = (unsigned char)((sum&0xFF00) >> 8); //存储校验和array.RemoveAll();//清空数组 array.SetSize(m_sendlength);//设置数组大小为帧长度 for(i=0; i< m_sendlength; i++) //把待发送数据存入数组 {array.SetAt(i,Txbufer[i]); } m_mscomm.put_Output(COleVariant(array));}
- VS2010/MFC 入门编程七(基于MSCOMM32.OCX控件的串口编程)
- VS2010中使用MSComm32.OCX进行MFC串口通信编程(Win8.1)
- VS2010 没有串口控件 mscomm32.ocx
- JavaScript串口(通过vb的MSCOMM32.OCX控件)
- 串口通讯控件Mscomm32.ocx的应用
- 注册MSComm32.ocx串口控件
- VC2010基于MSComm32控件的串口通讯
- VS2010/MFC编程入门之七(对话框:创建对话框类和添加控件变量)
- VS2010/MFC编程入门之七(对话框:创建对话框类和添加控件变量)
- VS2010/MFC编程入门之七(对话框:为对话框添加控件)
- 注册串口通讯控件MSCOMM32.OCX
- VS2010/MFC编程入门之二十二(常用控件:按钮控件的编程实例)
- VS2010/MFC编程入门之二十二(常用控件:按钮控件的编程实例)
- VS2010/MFC编程入门之二十三(常用控件:按钮控件的编程实例)
- VS2010下MFC的串口编程
- 转VS2010下MFC的串口编程
- VS2010/MFC入门编程十五(COMBOX 控件操作)
- VS2010/MFC 入门编程十六(Check Box控件使用)
- springmvc 数据转换与格式化
- jquery定义多样式
- SQL Limit 用法
- HTML select option 详解
- 如何使用Bitcoin客户端-1
- VS2010/MFC 入门编程七(基于MSCOMM32.OCX控件的串口编程)
- 最大流最小割定理
- freeswitch 800 路并发数测试
- 单例模式
- Android 模拟器功能
- android 入门xml布局文件
- Spring3+Hibernate4+SpringMVC整合Ext:项目架构搭建
- nodejs连接mysql
- shell编程——if语句