VCMFC串口通信编写全过程Word文档格式.doc
《VCMFC串口通信编写全过程Word文档格式.doc》由会员分享,可在线阅读,更多相关《VCMFC串口通信编写全过程Word文档格式.doc(17页珍藏版)》请在冰豆网上搜索。
b、右击编辑框、属性、常规、ID:
中输入ID号,此编辑框用于接收显示数据的其ID号为IDC_EDIT_RXDATA(可以随意选取,但程序中应与所取ID号一致),再在此窗口的样式中勾选”多行”,同时将“自动水平滚动(T)”勾选去掉,再勾选“垂直滚动(V)”,此勾选操作是用于垂直多行显示的,按回车后即可输入;
同理右击另一编辑框输入ID号为IDC_EDIT_TXDATA此编辑框用于编辑发送数据的,同样也选上用于垂直多行显示,发送框可以不用垂直多行显示;
再为按钮控件添加ID号,为IDC_BUTTON_MANUALSEND,并将标题中的“Button1”改为“发送”,功能是按一次就把发送编辑框中的内容发送一次。
C、为以上两个编辑框添加变量,与串口通信控件一样添加,为IDC_EDIT_RXDATA添加CString型变量m_strRXData;
为IDC_EDIT_TXDATA添加CString型变量m_strTXData。
说明:
m_strRXData和m_strTXData分别用来放入接收和发送的字符数据。
D、添加串口事件消息处理函数OnComm()打开ClassWizard->
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:
voidCSC