博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转载)用vs2010开发基于VC++的MFC 串口通信一*****两台电脑同一个串口号之间的通信...
阅读量:5292 次
发布时间:2019-06-14

本文共 3061 字,大约阅读时间需要 10 分钟。

此文章以visual C++数据採集与串口通信測控应用实战为參考教程

此文章适合VC++串口通信入门

一、页面布局及加入控件

1, 安装好vs2010如图

2, 新建一个基于VC++的MFC项目comm

注意:点击ok,然后next,这时候要将application type改成dialog base。接着next到最后一个对话框是将generated dasses改成CcommDlg,然后finish

4, 将新生成的项目的对话框默认dialog edit删去,如图

5,在对话框中加入两个static text,两个edit text,两个button。

成品图例如以下

6,加入comm控件

    1)在解决方式窗体右击新建的解决方式,点击add->class

     2)选择MFC class from activex control如图

点击add,available activex controls选择microsoft communication controls versions 6.0,然后点确定即可

这时候对话框会出现一个电话图标,可能有一半白边去不了。这时候右击电话图标点击edit control就能够去掉了。

7,同一时候定义各个控件的类型、ID及相关属性

注:此项目仅仅加入了发送和退出程序button

这时候得到了完整的串口通信对话框:

8, 加入成员变量。右击对话框,点击class wizard,点击member variables标签。选中须要加入的id,双击就可以加入

依次为下表中的ID加入变量

期间,IDC_MSCOMM1控件在标签中没有,则在生成的对话框中右击comm控件点击add variables就可以

9, 为mscomm,两个button加入响应事件,切换到class wizard的virtual function双击控件ID,加入响应事件,默认就可以,也可改为自己想要的标题

为comm控件加入响应事件可能双击不了(我就是遇到这样的问题)。这时候仅仅要右击comm控件图标。点击add event handler就可以。如图

这时候基本界面已经布置好了。開始加入代码了。

二、代码加入

1、找到解决方式(solution explorer)的sources files点开,双击当中的mscommDlg.cpp我们的全部代码将加入到这个源文件里

2、进行串口初始化及其它串口设置

将下面代码加入到oninitialdialog函数

m_ctrlcomm.put_CommPort(3);//选择com3口

m_ctrlcomm.put_InputMode(1);//输入方式为二进制方式
m_ctrlcomm.put_InBufferSize(1024);//输入缓冲区大小为1024byte
m_ctrlcomm.put_OutBufferSize(512);//输出缓冲区大小为512byte
m_ctrlcomm.put_Settings(_T("9600,n,8,1"));//设置串口參数:9600波特率。无奇偶校验。8个数据位,1个停止位
if(!m_ctrlcomm.get_PortOpen())
    m_ctrlcomm.put_PortOpen(1);//打开串口
m_ctrlcomm.put_RThreshold(1);//每当串口接收缓冲区有多余或等于1个字符时将引发一个接收数据的oncomm事件
m_ctrlcomm.put_InputLen(0);//设置当前接收区数据长度为0
m_ctrlcomm.get_Input();//预读缓冲区以清空残留数据
m_ctrlcomm.put_CommPort(3);//选择com3口
m_ctrlcomm.put_InputMode(1);//输入方式为二进制方式
m_ctrlcomm.put_InBufferSize(1024);//输入缓冲区大小为1024byte
m_ctrlcomm.put_OutBufferSize(512);//输出缓冲区大小为512byte
m_ctrlcomm.put_Settings(_T("9600,n,8,1"));//设置串口參数:9600波特率,无奇偶校验,8个数据位,1个停止位
if(!m_ctrlcomm.get_PortOpen())
    m_ctrlcomm.put_PortOpen(1);//打开串口
m_ctrlcomm.put_RThreshold(1);//每当串口接收缓冲区有多余或等于1个字符时将引发一个接收数据的oncomm事件
m_ctrlcomm.put_InputLen(0);//设置当前接收区数据长度为0
m_ctrlcomm.get_Input();//预读缓冲区以清空残留数据
2、实现发送button,退出button对应的响应函数

void CmscommDlg::OnBnClickedOk()

{
// TODO: Add your control notification handler code here
CDialogEx::OnOK();
UpdateData(1);//读取编辑框内容
m_ctrlcomm.put_Output(COleVariant(m_strsend));//发送数据
}
void CmscommDlg::OnBnClickedExit()
{
// TODO: Add your control notification handler code here
m_ctrlcomm.put_PortOpen(0);//关闭串口
CDialog::OnCancel();//退出程序
}
3、实现MSComm控件对应的响应函数OnOnCommMsComm1()

VARIANT variant_inp;

COleSafeArray safearray_inp;

LONG len,k;

BYTE rxdata[2048];//设置byte数组

CString strtemp;

if(m_ctrlcomm.get_CommEvent()==2)//事件2表示接受缓冲区有字符

{

variant_inp=m_ctrlcomm.get_Input();//读缓冲区

safearray_inp=variant_inp;//variant数据转换成colesafearray型变量

len=safearray_inp.GetOneDimSize();//得到有效数据长度

for(k=0;k<len;k++)

safearray_inp.GetElement(&k,rxdata+k);//转换为byte型数组

for(k=0;k<len;k++){//将数组转换成CString型变量

BYTE bt=*(char *)(rxdata+k);//字符型

strtemp.Format((char) bt);//将字符送入暂时变量strtemp存放

m_strreceive+=strtemp;//增加接收编辑框对应字符串

}

}

UpdateData(0);//更新编辑框内容

4、编译执行程序

在调试执行时。必须两台机子同一时候执行此程序。而且都要开启同一个串口号

转载于:https://www.cnblogs.com/lxjshuju/p/6741005.html

你可能感兴趣的文章
查看linux 之mysql 是否安装的几种方法
查看>>
javascript中的传递参数
查看>>
objective-c overview(二)
查看>>
python查询mangodb
查看>>
软件测试(基础理论一)摘
查看>>
CF327E Axis Walking
查看>>
关于eclipse maven引入第三方jar包后如何下载源代码
查看>>
no-sql数据库之redis
查看>>
关于浏览器内核的一些小知识,明明白白选浏览器!-
查看>>
2018年6月1日学习内容概要
查看>>
利用 Gearman 实现系统错误报警功能
查看>>
HDU 4035 期望dp
查看>>
bzoj 2301 莫比乌斯反演
查看>>
Tensor索引操作
查看>>
mongoose连表查询2
查看>>
html5 SVG
查看>>
.Net学习 第2季06 C#面向对象 Path类 File类 FileStream类 StreamReader/StreamWriter类
查看>>
VS2008+Qt 项目目录编辑配置
查看>>
【动态规划DP】传娃娃-C++
查看>>
LOJ.121.[离线可过]动态图连通性(线段树分治 按秩合并)
查看>>