VC60MFC串口通信编写全过程精编版Word格式.docx
- 文档编号:20440889
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:21
- 大小:125KB
VC60MFC串口通信编写全过程精编版Word格式.docx
《VC60MFC串口通信编写全过程精编版Word格式.docx》由会员分享,可在线阅读,更多相关《VC60MFC串口通信编写全过程精编版Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
MessageMaps,选择IDC_MSCOMM1,双击消息OnComm,将弹出的对话框中将函数名改为OnComm,(好记而已)OK。
这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接收数据缓冲区中有字符的消息事件,我们刚才添加的函数就会执行,我们在OnComm()函数加入相应的处理代码就能实现自已想要的功能了。
在函数中加入如下代码:
提示1:
此句以下才是我们要添加的语句
代码段1:
voidCScommTestDlg:
:
OnComm()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
VARIANTvariant_inp;
//定义一个VARIANT类对象
COleSafeArraysafearray_inp;
//定义一个COleSafeArray对象
LONGlen,k;
BYTErxdata[2048];
//设置BYTE数组AN8—intterthatisnotsigned.
CStringstrtemp;
if(m_ctrlComm.GetCommEvent()==2)//事件值为2表示接收缓冲区内有数据
{
////以下你可以根据自己的通信协议加入处理代码
variant_inp=m_ctrlComm.GetInput();
//读缓冲区
safearray_inp=variant_inp;
//VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize();
for(k=0;
k<
len;
k++)
{
safearray_inp.GetElement(&
k,rxdata+k);
//转换为BYTE型数组
}
提示2:
此三句是下面用于是否是十六进制发送的,暂时可以不用理会
k++)//将数组转换为Cstring型变量
BYTEbt=*(char*)(rxdata+k);
//if(m_ctrlHexSend.GetCheck())//如果是HEX显示则转为16进制
//strtemp.Format("
%02x"
bt);
//将16进制数送入临时变量strtemp存放
//else
strtemp.Format("
%c"
//将字符送入临时变量strtemp存放
m_strRXData+=strtemp;
//加入接收编辑框对应字符串
}
}
UpdateData(FALSE);
//更新编辑框内容(主要是接收编辑框中的)
}
到目前为止还不能在接收编辑框中看到数据,因为我们还没有打开串口,但运行程序不应该有任何错误,不然,你肯定哪儿没看仔细,因为我是打开VC6对照着做一步写一行的,运行试试。
没错吧?
那么做下一步:
E、打开串口和设置串口参数
你可以在你需要的时候打开串口,例如在程序中做一个开始按钮,在该按钮的处理函数中打开串口。
现在我们在主对话框的CSCommTestDlg:
OnInitDialog()打开串口,加入如下代码:
代码段2:
BOOLCSCommTestDlg:
OnInitDialog()
CDialog:
OnInitDialog();
//Add"
About..."
menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&
0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<
0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->
AppendMenu(MF_SEPARATOR);
AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
提示3:
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'
smainwindowisnotadialog
提示4:
此5句是我们下面要用到的暂时可以不用理会
SetIcon(m_hIcon,TRUE);
//Setbigicon
SetIcon(m_hIcon,FALSE);
//Setsmallicon
Addextrainitializationhere
//m_ComboBox.SetCurSel(0);
//打开软件时串口选择框默认显示COM1
//m_BaudRate_M.SetCurSel(0);
//打开软件时波特率选择框默认显示9600
//m_Date_Select_M.SetCurSel(0);
//打开软件时数据位选择框默认显示8
//m_StopBit_M.SetCurSel(0);
//打开软件时停止位选择框默认显示1
//m_ParityCheck_M.SetCurSel(0);
//打开软件时奇偶校验选择框默认显示无校验N
//下面if语句用于打开默认串口
/************************************************************/
if(m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(FALSE);
//关闭串口
}
m_ctrlComm.SetCommPort
(1);
//打开软件时默认使用COM1串口
if(!
m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(TRUE);
//打开串口
else
AfxMessageBox("
cannotopenserialport"
);
}
/*************************************************************/
m_ctrlComm.SetSettings("
9600,n,8,1"
//打开软件时端口设置默认为波特率9600,无校验位,8位数据,1位停止位
m_ctrlComm.SetInputMode
(1);
//1:
表示以二进制方式检取数据
m_ctrlComm.SetRThreshold
(1);
//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_ctrlComm.SetInputLen(0);
//设置当前接收区数据长度为0
m_ctrlComm.GetInput();
//先预读缓冲区以清除残留数据
returnTRUE;
//returnTRUEunlessyousetthefocustoacontrol
F、发送数据,先为发送按钮添加一个单击消息即BN_CLICKED处理函数,打开ClassWizard->
MessageMaps,选择IDC_BUTTON_MANUALSEND,双击BN_CLICKED添加OnButtonManualsend()函数,并在函数中添加如下代码:
代码段3:
voidCSCommTestDlg:
OnButtonManualsend()
//TODO:
UpdateData(TRUE);
//读取编辑框内容
m_ctrlComm.SetOutput(COleVariant(m_strTXData));
//发送数据
此时运行程序,在发送编辑框中随意输入数,单击发送按钮,若出错则修改后再测试,直到成功再进行以下操作。
5、添加两个“组框”或“静态文本”控件,调整位置及大小,在标师处输入提示文字,这两个控件不用编程,效果如下图:
6、添加5个“静态文本”控件并由属性修改其标题,均不用编程,效果如下图:
7、添加5个“组框”控件,效果如下图:
逐一对各个组框属性编辑如下:
串口号:
常规ID:
IDC_COMBO_CommSelect
数据输入列表框项目(N):
COM1、COM2、COM3、COM4、COM5、COM6、COM7、COM8、COM9(注意每输入一个数据选项以Ctrl+Enter回车后再输入下一个数据选项)
样式将“分类勾选去掉”
进入类向导添加变量,为IDC_COMBO_CommSelect添加一个value类int型变量m_Index,点击OK后,再添加一个Control类CComboBox型变量m_ComboBox点击OK最后“确定”
波特率:
常规ID:
IDC_COMBO_BaudRate_Select
9600、14400、19200、38400、56000、57600、115200、128000、256000
进入类向导添加变量,为IDC_COMBO_BaudRate_Select添加一个value类int型变量m_BaudRate点击OK后,再添加一个Control类CComboBox型变量m_BaudRate_M点击OK最后“确定”
数据位:
IDC_COMBO_Date_Select
数据输入列表框项目(N):
8、7、6、5、4
进入类向导添加变量,为IDC_COMBO_Date_Select添加一个value类int型变量m_Date_Select点击OK后,再添加一个Control类CComboBox型变量m_Date_Select_M点击OK最后“确定”
停止位:
IDC_COMBO_StopBit
1、2
进入类向导添加变量,为IDC_COMBO_StopBit添加一个value类int型变量m_StopBit点击OK后,再添加一个Control类CComboBox型变量m_StopBit_M点击OK最后“确定”
奇偶校验位:
IDC_COMBO_ParityCheck
N、O、E、
样式将“分类勾选去掉”
进入类向导添加变量,为IDC_COMBO_ParityCheck添加一个value类int型变量m_ParityCheck点击OK后,再添加一个Control类CComboBox型变量m_ParityCheck_M点击OK最后“确定”
以上数据配置添加的Control类CComboBox型变量可能用不到,但value类必须为int型
8、为各个列表框添加处理函数:
A、在建立类向导中MessageMaps,objectIDs中选中IDC_COMBO_CommSelect再在Messages中选中CBN_SELCHANG双击后单击OK,再在Memberfuntions中双击刚才生成的函数进入程序编辑页面,添加程序代码如下:
代码段4:
voidCSCommTestDlg:
OnSelchangeCOMBOCommSelect()
m_Index=((CComboBox*)GetDlgItem(IDC_COMBO_CommSelect))->
GetCurSel();
//当前选中的行
((CComboBox*)GetDlgItem(IDC_COMBO_CommSelect))->
SetCurSel(m_Index);
//设置当前选中的行的内容为显示的内容
if(m_ctrlComm.GetPortOpen())//当要改变时则要先关闭串口才可以用按键进行打开,所以先判断当前串口是否打开
提示5:
下面添加串口打开或关闭按钮后将用到此将用到此判断及以下语句
{//如果是打开的则先关闭
SetDlgItemText(IDC_BUTTON1,"
打开串口"
//将打开或关才按钮改为"
显示状态
B、同理为IDC_COMBO_BaudRate_Select添加处理函数程序代码如下:
代码段5:
OnSelchangeCOMBOBaudRateSelect()
UpdateData(true);
m_BaudRate=((CComboBox*)GetDlgItem(IDC_COMBO_BaudRate_Select))->
//当前选中的行
////***********************************************************/
///根据当前选中的值进行波特率设置
///************************************************************/
switch(m_BaudRate)
{
case1:
14400,,,"
break;
case2:
19200,,,"
case3:
38400,,,"
case4:
56000,,,"
case5:
57600,,,"
case6:
115200,,,"
case7:
128000,,,"
case8:
256000,,,"
default:
m_ctrlComm.SetSettings("
9600,,,"
//*************************************************////
UpdateData(false);
C、同理为IDC_COMBO_Date_Select添加处理函数程序代码如下:
代码段6:
OnSelchangeCOMBODateSelect()
m_Date_Select=((CComboBox*)GetDlgItem(IDC_COMBO_Date_Select))->
///*******************************************************************************/
///********************************************************************************/
switch(m_Date_Select)
,7,"
,6,"
,5,"
,4,"
,8,"
//*********************************************************************************//
UpdateData(false);
D、同理为IDC_COMBO_StopBit添加处理函数程序代码如下:
OnSelchangeCOMBOStopBit()
m_StopBit=((CComboBox*)GetDlgItem(IDC_COMBO_StopBit))->
switch(m_StopBit)
,,2"
,,1"
E、同理为IDC_COMBO_ParityCheck添加处理函数程序代码如下:
代码段7:
OnSelchangeCOMBOParityCheck()
m_ParityCheck=((CComboBox*)GetDlgItem(IDC_COMBO_ParityCheck))->
///**********************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC60MFC 串口 通信 编写 全过程 精编