好文档 - 专业文书写作范文服务资料分享网站

VC6.0MFC串口通信编写全过程(DOC)

天下 分享 时间: 加入收藏 我要投稿 点赞

其于MFC的串口调试助手编辑过程

一、新建

打开VC6.0 文件 新建 工程 MFC AppWiard(exe) 位置(选择保存工程位置) 工程名称(输入工程名XXXX) 确定 选择基本对话框 下一步 下一步 下一步 选择(CXXXXDlg) 完成 确定 在生成的基本对话框内将不需要按钮及提示框(自动生成的“确定”“取消” 及提示框)删除或修改使用,至此基本框架完成如下图:

基本框架

二、往生成的基本框架中添加控件

1、因为控件列表框内没有串口通信用到的通信控件,所以要先添加到控件列表框内再将控件添加到基本框内使用,步骤如下:

菜单栏 工程 添加到工程 Components and controls… Registered ActiveX Controls 选择“Microsoft Communications Control, version 6.0” Insert 确定 OK 关闭此子窗口完成添加操作标志如上图所示。 2、将刚才添加添加到控件列表框内的串口控件添加到基本框架内 点击控件列表框内的串口控件,此时光标变为“十”形,在基本框架内随意划取一矩

形区域,即可以添加串口控件,不需要修改此控件的大小及位置,因为程编译运行后此控件是看不到的,步骤结果如下图:

此控件(标志)是下面步骤添加进来的串口控件

3、继续往基本框架内添加用于编辑发送数据的输入编辑框及输出编辑框,同理选择控件列表框内的“编辑框控件”,以相同的操作即可添加两个编辑窗口及一个按纽控件如下图所示:

选择其中任意一个作为输入编辑框及输出编辑框

这两个窗口需要修改大小及位置,因为程序运行后将会显示而串口通信控件则不显示,上图是运行后的效果。

4、对以上四个控件编程步骤如下:

a、右击串口通信控件 建立类向导 Member variables Control IDS中选择IDC_MSCOMM1 add variable… Member variable name中输入控件变量名m_ctrlComm(变量名可以随意选取,但程序中应与所取变量名一致) OK 确定

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->Message Maps,选择IDC_MSCOMM1,双击消息OnComm,将弹出的对话框中将函数名改为OnComm,(好记而已)OK。

这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接收数据缓冲区中有字符的消息事件,我们刚才添加的函数就会执行,我们在OnComm()函数加入相应的处理代码就能实现自已想要的功能了。在函数中加入如下代码:

提示1:此句以下void CScommTestDlg::OnComm()

才是我们要添加{

的语句 // TODO: Add your control notification handler code here

VARIANT variant_inp;//定义一个VARIANT类对象

COleSafeArray safearray_inp;//定义一个COleSafeArray对象 LONG len,k;

BYTE rxdata[2048];//设置BYTE数组 AN 8—intterthat is not signed. CString strtemp;

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

for(k=0;k

提示2:此三句是 { 下面用于是否是十 BYTE bt=*(char*)(rxdata+k); 六进制发送的,暂 //if(m_ctrlHexSend.GetCheck())//如果是HEX显示则转为16进制 时可以不用理会 // strtemp.Format(\//将16进制数送入临时变量strtemp存放

// else

代码段1:

strtemp.Format(\将字符送入临时变量strtemp存放 m_strRXData+=strtemp;//加入接收编辑框对应字符串 } }

UpdateData(FALSE);//更新编辑框内容(主要是接收编辑框中的) }

到目前为止还不能在接收编辑框中看到数据,因为我们还没有打开串口,但运行程序不应该有任何错误,不然,你肯定哪儿没看仔细,因为我是打开VC6对照着做一步写一行的,运行试试。没错吧?那么做下一步:

E、打开串口和设置串口参数 你可以在你需要的时候打开串口,例如在程序中做一个开始按钮,在该按钮的处理函数中打开串口。现在我们在主对话框的CSCommTestDlg::OnInitDialog()打开串口,加入如下代码:

代码段2:

BOOL CSCommTestDlg::OnInitDialog() {

CDialog::OnInitDialog();

// Add \

// 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 提示3:此句以下才 // 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_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

提示4:此5句是我们下面要用到的暂时可以不用理会 //下面if语句用于打开默认串口

/************************************************************/ if(m_ctrlComm.GetPortOpen()) {

m_ctrlComm.SetPortOpen(FALSE);//关闭串口 }

m_ctrlComm.SetCommPort(1);//打开软件时默认使用COM1串口 if(!m_ctrlComm.GetPortOpen()) {

m_ctrlComm.SetPortOpen(TRUE);//打开串口 } else {

AfxMessageBox(\ }

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

m_ctrlComm.SetSettings(\打开软件时端口设置默认为波特率9600,无校验位,8位数据,1位停止位

m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据

m_ctrlComm.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件

m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0 m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据

return TRUE; // return TRUE unless you set the focus to a control }

F、发送数据,先为发送按钮添加一个单击消息即BN_CLICKED处理函数,打开ClassWizard->Message Maps,选择IDC_BUTTON_MANUALSEND,双击BN_CLICKED添加OnButtonManualsend()函数,并在函数中添加如下代码:

代码段3:

void CSCommTestDlg::OnButtonManualsend() {

// TODO: Add your control notification handler code here UpdateData(TRUE); //读取编辑框内容

m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送数据

}

此时运行程序,在发送编辑框中随意输入数,单击发送按钮,若出错则修改后再测试,直到成功再进行以下操作。

5、添加两个“组框”或“静态文本”控件,调整位置及大小,在标师处输入提示文字,这两个控件不用编程,效果如下图:

VC6.0MFC串口通信编写全过程(DOC)

其于MFC的串口调试助手编辑过程一、新建打开VC6.0文件新建工程MFCAppWiard(exe)位置(选择保存工程位置)工程名称(输入工程名XXXX)确定选择基本对话框下一步下一步下一步选择(CXXXXDlg)完成确定在生成的基本
推荐度:
点击下载文档文档为doc格式
0g0j04yhk617c19373fh7l7tx29ybm00g5c
领取福利

微信扫码领取福利

微信扫码分享