VC60MFC串口通信编写全过程精编版Word格式.docx

上传人:b****6 文档编号:20440889 上传时间:2023-01-23 格式:DOCX 页数:21 大小:125KB
下载 相关 举报
VC60MFC串口通信编写全过程精编版Word格式.docx_第1页
第1页 / 共21页
VC60MFC串口通信编写全过程精编版Word格式.docx_第2页
第2页 / 共21页
VC60MFC串口通信编写全过程精编版Word格式.docx_第3页
第3页 / 共21页
VC60MFC串口通信编写全过程精编版Word格式.docx_第4页
第4页 / 共21页
VC60MFC串口通信编写全过程精编版Word格式.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

VC60MFC串口通信编写全过程精编版Word格式.docx

《VC60MFC串口通信编写全过程精编版Word格式.docx》由会员分享,可在线阅读,更多相关《VC60MFC串口通信编写全过程精编版Word格式.docx(21页珍藏版)》请在冰豆网上搜索。

VC60MFC串口通信编写全过程精编版Word格式.docx

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))->

///**********************************************

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1