串口控件发送数据初始化设置:
1,打开串口按钮初始化设置
void CSerialPortDlg::OnBnClickedButtonOpen() //发送按钮程序初始化
{
//TODO: 在此添加控件通知处理程序代码
if(m_mscomm.get_PortOpen()) //r如果串口是打开的,则关闭串口
{
m_mscomm.put_PortOpen(FALSE);
}
m_mscomm.put_CommPort(1); //选择COM1
m_mscomm.put_InBufferSize(1024); //接收缓冲区
m_mscomm.put_OutBufferSize(1024); //发送缓冲区
m_mscomm.put_InputLen(0); //设置当前接收区数据长度为0,表示全部读取
m_mscomm.put_InputMode(1); //以二进制方式读写数据
m_mscomm.put_RThreshold(1); //缓冲区有1个及1个以上字符时,将引发接收数据OnComm事件
m_mscomm.put_Settings(_T("9600,n,8,1")); //波特率为9600无检验位,8个数据位,1个停止位
if(!m_mscomm.get_PortOpen()) //如果串口1没有打开成功,则打开串口
{
m_mscomm.put_PortOpen(TRUE);
AfxMessageBox(_T("串口1打开成功"));
}
Else //
{
m_mscomm.put_OutBufferCount(0); //串口1打开失败,则输出缓冲区计数为0
AfxMessageBox(_T("串口1打开失败"));
}
}
2,关闭串口控件初始化
void CSerialPortDlg::OnBnClickedButtonClose()
{
//TODO: 在此添加控件通知处理程序代码
m_mscomm.put_PortOpen(FALSE); //关闭串口1
AfxMessageBox(_T("关闭串口"));
}
3,控件消息事件处理程序
void CSerialPortDlg::OnCommMscomm() //串口控件事件处理程序
{
//TODO: 在此处添加消息处理程序代码
staticunsignedintcnt = 0;
VARIANT variant_inp;
COleSafeArray safearray_inp;
longlen, k;
unsignedintdata[1024] = { 0 };
byte rxdata[1024]; //设置BYTE数组
CString strtemp;
if(m_mscomm.get_CommEvent() == 2) //值为2,表示接收缓冲区内有字符
{
cnt++;
variant_inp= m_mscomm.get_Input(); //读缓冲区消息
safearray_inp= variant_inp; //变量转换
len= safearray_inp.GetOneDimSize(); //得到有效的数据长度
for(k = 0; k < len; k++)
{
safearray_inp.GetElement(&k,rxdata + k); //转换为字节型数组
}
for(k = 0; k < len; k++) //将数组转换为CString变量
{
strtemp.Format(_T("%x"),*rxdata + k);
m_EditReceive+= strtemp; //将采集到的数据加入接收编辑框变量
CString temp =_T("\r\n"); //换行
m_EditReceive+= temp; //加入接收编辑框原有字符串
}
}
UpdateData(FALSE);
}
4,发送按钮程序初始化
//发送数据函数调用很简单,关键是类中发送函数的定义
void CSerialPortDlg::OnBnClickedButtonSend()
{
//TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE); //读取编辑框内容
m_mscomm.put_Output(COleVariant(m_EditSend)); //发送数据
m_EditSend.Empty(); //发送后清空数据框
UpdateData(FALSE); //更新编辑框内容
}
5,
注意:写串口通信时,总共有四步骤:
1,打开串口 一个open()函数搞定
2,设置串口(串口初始化:波特率9600,数据位8,停止位1,奇偶校验位0),可以在程序初始化中添加程序,也可以发送按钮中添加程序
3,接收数据(读取数据),一般在串口控件消息触发事件函数中添加程序。比如串口缓冲区接收到一个字符消息,则触发串口控件消息触发函数。
4,发送数据 一个函数搞定
现场辅助测试接口
1,直接调用源程序的open()函数,然后转到定义里,将相关的程序申明和定义复制到一个单独程序文件中
2,将设置串口的初始化定义在open()函数中
3,然后在串口触发事件中,从缓冲区读取数据read
4,写数据函数write
5,关闭串口close
20170619笔记
调用一个类中的成员函数
1,首先建立一个类PPI
2,然后建立一个PPI类的变量 PPI P01
3,接着PPI类的变量就可以调用PPI类中的成员函数:P01.open()
将控件的关联变量变为全局变量方法之一:
首先将关联变量值m_mo传给全局变量m_glbmo然后经过全局变量m_glbmo处理完后,再传给关联变量
遇到的问题1:之前不知道怎么从一个类移出,放在另外一个单独文件的类中
原因:我的基础知识不够扎实,或者说对程序的应用不够。其实这个问题很简单,利用的是类的定义。相当于在另外一个文件夹中定义一个新的类,只要将原来文件的类读懂,然后将相应的头文件,源文件复制到另一个新的类中,然后看看提示,就可以解决问题了。
比如在类头文件.h申明,在类源文件.cpp定义
// *************头文件申明类******************
#pragma once
class ppi02
{
public:
ppi02();
~ppi02();
intt;
voidclose(bool a);
};
//***************源文件定义类**********
#include "stdafx.h"
#include "ppi02.h"
ppi02::ppi02()
{
}
ppi02::~ppi02()
{
}
void ppi02::close(boolt)
{
AfxMessageBox(_T("this is a message!"));
}
//***************在DelG文件调用类*********
//***************只需在开头加一个头文件就行*********
void CSerialPort3Dlg::OnBnClickedButton2()
{
//TODO: 在此添加控件通知处理程序代码
ppi02 p02;
boolC = 1;
p02.close(C);
}
编译后的结果(单击按钮2,弹出如下信息)