没有合适的资源?快使用搜索试试~ 我知道了~
首页VC++下用MSComm控件实现串口通讯
资源详情
资源评论
资源推荐
VC++下用 MSComm 控件实现串口通讯
首先,在对话框中创建通信控件,若 Control 工具栏中缺少该控件,可通过菜单 Project
--> Add to Project --> Components and Control 插入即可,再将该控件从工具箱中拉到对话框
中。此时,你只需要关心控件提供的对 Windows 通讯驱动程序的 API 函数的接口。换句话
说,只需要设置和监视 MSComm 控件的属性和事件。
打开所需串口后,需要考虑串口通信的时机。在接收或发送数据过程中,可能需要监
视并响应一些事件和错误,所以事件驱动是处理串行端口交互作用的一种非常有效的方法
使用 OnComm 事件和 CommEvent 属性捕捉并检查通讯事件和错误的值。发生通讯事件或
错 误 时 , 将 触 发 OnComm 事 件 , CommEvent 属 性 的 值 将 被 改 变 , 应 用 程 序 检 查
CommEvent 属性值并作出相应的反应
// 若是在 SDI 中使用该控件则要调用下两句,在对话框程序中该语句有 MFC 自己创建
// 所以不用人为添加
DWORD style=WS_VISIBLE;
m_MSComm.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1);
// 串口控件的初始化
DWORD style=WS_VISIBLE;
m_MSComm.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1);
if(m_MSComm.GetPortOpen()) //如果串口是打开的,则行关闭串口
{
m_MSComm.SetPortOpen(FALSE);
}
m_MSComm.SetCommPort(1); //选择 COM1
m_MSComm.SetInBufferSize(1024); //接收缓冲区
m_MSComm.SetOutBufferSize(1024);//发送缓冲区
m_MSComm.SetInputLen(0);//设置当前接收区数据长度为 0,表示全部读取
m_MSComm.SetInputMode(1);//以二进制方式读写数据
m_MSComm.SetRThreshold(1);//接收缓冲区有 1 个及 1 个以上字符时,将引发接收数据的
OnComm 事件
m_MSComm.SetSettings("9600,n,8,1");//波特率 9600 无检验位,8 个数据位,1 个停止位
if(!m_MSComm.GetPortOpen())//如果串口没有打开则打开
m_MSComm.SetPortOpen(TRUE);//打开串口
else
m_MSComm.SetOutBufferCount(0);
// 控件事件的响应声明
// *.h
//{{AFX_MSG(CGolfView)
afx_msg BOOL OnComm();
DECLARE_EVENTSINK_MAP()
//}}AFX_MSG
// *.cpp
BEGIN_EVENTSINK_MAP(CGolfView, CView)
//{{AFX_EVENTSINK_MAP(CAboutDlg)
ON_EVENT(CGolfView, IDC_MSCOMM1, 1 /* OnComm */, OnComm, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
// 控件事件的响应
BOOL CGolfView::OnComm()
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置 BYTE 数组 An 8-bit integerthat is not signed.
CString strtemp;
switch(m_MSComm.GetCommEvent())
{
case 1: // comEvSend 发送数据
break;
case 2: // comEvReceive 读取数据
// MessageBox(_T("读取数据事件"), _T("TRACE"), MB_OK);
variant_inp=m_MSComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT 型变量转换为 ColeSafeArray 型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
// 接受数据
for(k=0; k<len; k++)
{
safearray_inp.GetElement(&k,rxdata+k); //转换为 BYTE 型数组
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量 strtemp 存放
recd+=strtemp;
}
// UpdateData(TRUE);
break;
default: // 传输事件出错
m_MSComm.SetOutBufferCount(0);
break;
}
UpdateData(FALSE); //更新图象内容
return TRUE;
}
核心代码
初始化函数
BOOL CSCommTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu. made by lzycsd
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
////////////////////////////////////////////////
////其他初始化
m_ctrlComboComPort.SetCurSel(0); //初始选择串口 1
m_ctrlComboBaudRate.SetCurSel(6); //初始选择波特率 9600
m_ctrlComboParityBit.SetCurSel(0); //初始选择校验位无
m_ctrlComboDataBit.SetCurSel(3); //初始选择数据位 8 位
m_ctrlComboStopBit.SetCurSel(0); //初始选择停止位 1 位
剩余11页未读,继续阅读
fengyunqx
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论3