vc++mfc串口通信.docx
- 文档编号:4771146
- 上传时间:2022-12-08
- 格式:DOCX
- 页数:15
- 大小:74.89KB
vc++mfc串口通信.docx
《vc++mfc串口通信.docx》由会员分享,可在线阅读,更多相关《vc++mfc串口通信.docx(15页珍藏版)》请在冰豆网上搜索。
vc++mfc串口通信
Vc++串口通信(加密解密以及反馈协议)
一.主要功能:
实现两台计算机通过串口进行数据通信。
二.软件特色:
与本软件传输协议不同的串口信息接收到之后不做显示,发送过程中经过数据包加首部尾部来确定数据是否为同一个协议,之后再经过加密发送,接受时先解密,然后经过除去首部跟尾部来得到本来的数据。
三.加密原理:
发送时先加首部跟尾部,然后再将所有字符串转换成字符数组,进而对数组中的每个字符进行处理,具体方法是首先获得本次发送的数据总长度,单个字符减去本次字符串总长度的数字,再将数组转换成字符串发送出去,解码时先将受到的字符串转换成字符数组,再将每个字符加上本次接收到的字符串总长度,然后除去首部跟尾部,得到实际有用的数据。
四.协议原理:
在每次收到数据之后进行判断,是否为预先设定的反馈数据,如果是,则不做处理,如果不是,则进行发送反馈数据操作。
每次发送完数据对话框有提示“数据已发送“,当收到反馈数据时,提示”数据已成功接收“。
五.主要问题:
单次发送的数据不能大于33个字符,否则会接收不正常。
波特率已加到程序里面固定为“115200“,如果太小了可能会出现接收不到信息或者接收速度慢等情况。
六.界面图示:
1.发送完数据,但是对方未收到。
2.发送完数据,对方已经成功接收。
七.部分代码
界面设计
类向导中的函数设计
“serilDlg.cpp”文件内部代码
#include"stdafx.h"
#include"seril.h"
#include"serilDlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
intcomseril;
/////////////////////////////////////////////////////////////////////////////
//CAboutDlgdialogusedforAppAbout
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CSerilDlgdialog
CSerilDlg:
:
CSerilDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CSerilDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CSerilDlg)
m_strRXData=_T("");
m_strTXData=_T("");
m_TestFlag=_T("");
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCSerilDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSerilDlg)
DDX_Control(pDX,IDC_OPENSERIL,m_Opensril);
DDX_Control(pDX,IDC_COM,m_serilcom);
DDX_Text(pDX,IDC_EDIT_RXDATA,m_strRXData);
DDX_Text(pDX,IDC_EDIT_TXDATA,m_strTXData);
DDX_Control(pDX,IDC_MSCOMM1,m_ctrlComm);
DDX_Text(pDX,IDC_TESTFLAG,m_TestFlag);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSerilDlg,CDialog)
//{{AFX_MSG_MAP(CSerilDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_CLEAR,OnClear)
ON_BN_CLICKED(IDC_CLEARSEND,OnClearsend)
ON_CBN_CLOSEUP(IDC_COM,OnCloseupCom)
ON_BN_CLICKED(IDC_FASONG,OnFasong)
ON_BN_CLICKED(IDC_OPENSERIL,OnOpenseril)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CSerilDlgmessagehandlers
BOOLCSerilDlg:
:
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);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
//TODO:
Addextrainitializationhere
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCSerilDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
//thisisautomaticallydoneforyoubytheframework.
voidCSerilDlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
//Centericoninclientrectangle
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//Drawtheicon
dc.DrawIcon(x,y,m_hIcon);
}
else
{
CDialog:
:
OnPaint();
}
}
//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags
//theminimizedwindow.
HCURSORCSerilDlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
BEGIN_EVENTSINK_MAP(CSerilDlg,CDialog)
//{{AFX_EVENTSINK_MAP(CSerilDlg)
ON_EVENT(CSerilDlg,IDC_MSCOMM1,1/*OnComm*/,OnComm,VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
voidCSerilDlg:
:
OnComm()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
VARIANTvariant_inp;
COleSafeArraysafearray_inp;
LONGlen,k;
BYTErxdata[20480],rxtemp[20480]={0},top[20480],down[20480],jm[20480],jm1[20480];//设置BYTE数组An8-bitintegerthatisnotsigned.
CStringstrtemp,test,test1;
if(m_ctrlComm.GetCommEvent()==2)//事件值为2表示接收缓冲区内有字符
{//CStringrw="rw";
////////以下你可以根据自己的通信协议加入处理代码
variant_inp=m_ctrlComm.GetInput();//读缓冲区
safearray_inp=variant_inp;//VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize();//得到有效数据长度
for(k=0;k { safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组 } if(rxdata[0]=='r'&&rxdata[1]=='e'&&rxdata[2]=='c'&&rxdata[3]=='i'&&rxdata[4]=='v'&&rxdata[5]=='e') { m_TestFlag="已被成功接收"; } else { m_ctrlComm.SetOutput(COleVariant("recive")); } for(k=0;k<5;k++) { top[k]=rxdata[k]; } for(k=0;k<4;k++) { down[k]=rxdata[len-4+k]; } if(top[0]=='b'&&top[1]=='e'&&top[2]=='g'&&top[3]=='i'&&top[4]=='n'&&down[0]=='o'&&down[1]=='v'&&down[2]=='e'&&down[3]=='r') { for(k=0;k { rxtemp[k]=rxdata[k+5]; } for(k=0;k { jm1[k]=(rxtemp[k]-len+9); } for(k=0;k { BYTEbt=*(char*)(jm1+k);//字符型 strtemp.Format("%c",bt);//将字符送入临时变量strtemp存放 m_strRXData+=strtemp; } } } UpdateData(FALSE);//更新编辑框内容(主要是接收编辑框中的) } voidCSerilDlg: : OnFasong() { longsiz,k; CStringSendAll,sendal; UpdateData(TRUE);//读取编辑框内容 siz=strlen(m_strTXData); charcha[20480]; charcha1[20480]; charcha2[20480]; strcpy(cha,m_strTXData); for(k=0;k { cha1[k]=cha[k]+siz; } CStringstr(cha1,siz); SendAll="begin"+str+"over"; m_ctrlComm.SetOutput(COleVariant(SendAll));//发送数据 m_TestFlag="数据已发送"; UpdateData(FALSE);//读取编辑框内容 } voidCSerilDlg: : OnOpenseril() { //TODO: Addyourcontrolnotificationhandlercodehere m_ctrlComm.SetCommPort(comseril);//选择com口 if(m_ctrlComm.GetPortOpen()) { m_ctrlComm.SetPortOpen(FALSE);//关闭串口 //AfxMessageBox("cannotopenserialport"); AfxMessageBox("串口已关闭"); } else { m_ctrlComm.SetPortOpen(TRUE);//打开串口 AfxMessageBox("串口打开成功"); SetDlgItemText(IDC_OPENSERIL,"关闭串口");//显示串口已经关闭 m_ctrlComm.SetSettings("115200,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();//先预读缓冲区以清除残留数据 //m_TestFlag="未测试"; UpdateData(FALSE); } } voidCSerilDlg: : OnCloseupCom() { comseril=m_serilcom.GetCurSel(); } voidCSerilDlg: : OnClear() { m_strRXData=""; UpdateData(FALSE);//更新编辑框内容 //TODO: Addyourcontrolnotificationhandlercodehere } voidCSerilDlg: : OnClearsend() { //TODO: Addyourcontrolnotificationhandlercodehere m_strTXData=""; UpdateData(FALSE); }、 Seril.h内代码 //serilDlg.h: headerfile // //{{AFX_INCLUDES() #include"mscomm.h" //}}AFX_INCLUDES #if! defined(AFX_SERILDLG_H__1B7176B4_DDC7_45B3_B636_2597E461F275__INCLUDED_) #defineAFX_SERILDLG_H__1B7176B4_DDC7_45B3_B636_2597E461F275__INCLUDED_ #if_MSC_VER>1000 #pragmaonce #endif//_MSC_VER>1000 ///////////////////////////////////////////////////////////////////////////// //CSerilDlgdialog classCSerilDlg: publicCDialog { //Construction public: CSerilDlg(CWnd*pParent=NULL);//standardconstructor //DialogData //{{AFX_DATA(CSerilDlg) enum{IDD=IDD_SERIL_DIALOG}; CButtonm_Opensril; CComboBoxm_serilcom; CStringm_strRXData; CStringm_strTXData; CMSCommm_ctrlComm; CStringm_TestFlag; //}}AFX_DATA //ClassWizardgeneratedvirtualfunctionoverrides //{{AFX_VIRTUAL(CSerilDlg) protected: virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport //}}AFX_VIRTUAL //Implementation protected: HICONm_hIcon; //Generatedmessagemapfunctions //{{AFX_MSG(CSerilDlg) virtualBOOLOnInitDialog(); afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam); afx_msgvoidOnPaint(); afx_msgHCURSOROnQueryDragIcon(); afx_msgvoidOnClear(); afx_msgvoidOnClearsend(); afx_msgvoidOnCloseupCom(); afx_msgvoidOnFasong(); afx_msgvoidOnComm(); afx_msgvoidOnOpenseril(); DECLARE_EVENTSINK_MAP() //}}AFX_MSG DECLARE_MESSAGE_MAP() }; //{{AFX_INSERT_LOCATION}} //MicrosoftVisualC++willinsertadditionaldeclarationsimmediatelybeforethepreviousline. #endif//! defined(AFX_SERILDLG_H__1B
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- vc mfc 串口 通信