1、发送编辑框 和 接受编辑框添加通信串口控件,在对话框上右键在对话框右下角电话样子的就是串口通信控件给控件添加变量在电话图标上右击:命名如图示,点击完成 在工程中会自动生成mscomm.h 和mscomm.cpp两个文件;给两个编辑框添加成员变量添加三个按钮的事件直接双击 三个按钮 会在程序中自动添加如下函数cpp view plaincopyprint?void CCommTestDlg:OnBnClickedButtonSend() / TODO: 在此添加控件通知处理程序代码 OnBnClickedButtonOpen() / TODO:OnBnClickedButtonClose() /
2、 TODO:添加控件事件处理函数:点击添加编辑即可,在CommTestDlg.cpp中会生成函数:OnCommMscomm1() / TODO: 在此处添加消息处理程序代码 数据接收都是从这个函数处理打开串口函数实现: 在此添加控件通知处理程序代码 if(m_mscomm.get_PortOpen() m_mscomm.put_PortOpen(FALSE); m_mscomm.put_CommPort(3); /选择COM3 m_mscomm.put_InBufferSize(1024); /接收缓冲区 m_mscomm.put_OutBufferSize(1024);/发送缓冲区 m_ms
3、comm.put_InputLen(0);/设置当前接收区数据长度为0,表示全部读取 m_mscomm.put_InputMode(1);/以二进制方式读写数据 m_mscomm.put_RThreshold(1);/接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm m_mscomm.put_Settings(_T(9600,n,8,1);/波特率9600无检验位,8个数据位,1个停止位 if(!m_mscomm.get_PortOpen()/如果串口没有打开则打开 m_mscomm.put_PortOpen(TRUE);/打开串口 AfxMessageBox(_T(串口3打开成
4、功 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); /更新
5、编辑框内容 接受数据实现: 在此处添加消息处理程序代码 static unsigned int cnt=0; VARIANT variant_inp; COleSafeArray safearray_inp; long len,k; unsigned int data1024=0; byte rxdata1024; /设置 BYTE 数组 CString strtemp; if(m_mscomm.get_CommEvent()=2) /值为 2 表示接收缓冲区内有字符 cnt+; variant_inp=m_mscomm.get_Input(); /读缓冲区消息 safearray_inp=v
6、ariant_inp; /变量转换 len=safearray_inp.GetOneDimSize(); /得到有效的数据长度 for(k=0;k<len;k+) safearray_inp.GetElement(&k,rxdata+k); for(k=0;k+) /将数组转换为 CString 型变量 strtemp.Format(_T(%c),*(rxdata+k); m_EditReceive+=strtemp; CString temp=_T(rn); /换行 m_EditReceive+=temp; UpdateData(FALSE); /更新编辑框内容 /接收到的数据
7、存放在/byte 型数组 rxdata1024中,再进行进一步处理,此处只是/以 16 进制显示出来/说明(自己的理解):上面是基于事件驱动型的串口通信方式,感觉事件驱动与中断类似,但/绝对不是中断,每一次响应事件的时候接收缓冲区的数据的长度不是固定的。例如:我的下/位机发送了 10 个 BYTE 的数据,第一次上位机响应的时候只接收到 8 个,第二次响应时接收/到另外两个。并不是每收到一个数据就响应一次。下图是测试结果 收到的是a,b.显示的是数字码;特被注意的是这样编程并不是所有的电脑都会兼容MSCOMM32.OCX,这时候就需要我们手动的在代码里面动态的注册MSCOMM32.OCX控件,
8、函数的实现都是成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 的问题 上面不能
9、实现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 += Txbuferi; sum =sum0xFFFF; Txbuferm_sendlength+ = (unsigned char)(sum&0x00FF); Txbuferm_sendlength+ = (unsigned char)(sum&0xFF00) >& 8); /存储校验和 array.RemoveAll(); /清空数组 array.SetSize(m_sendlength); /设置数组大小为帧长度 for(i=0; i+) /把待发送数据存入数组 array.SetAt(i,Txbuferi); m_mscomm.put_Output(COleVariant(array);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1