vc++mfc串口通信

  • 格式:doc
  • 大小:134.00 KB
  • 文档页数:14

串口通信

1 Vc++串口通信(加密解密以及反馈协议)

一. 主要功能:实现两台计算机通过串口进行数据通信。

二. 软件特色:与本软件传输协议不同的串口信息接收到之后不做显示,发送过程中经过数据包加首部尾部来确定数据是否为同一个协议,之后再经过加密发送,接受时先解密,然后经过除去首部跟尾部来得到本来的数据。

三. 加密原理:发送时先加首部跟尾部,然后再将所有字符串转换成字符数组,进而对数组中的每个字符进行处理,具体方法是首先获得本次发送的数据总长度,单个字符减去本次字符串总长度的数字,再将数组转换成字符串发送出去,解码时先将受到的字符串转换成字符数组,再将每个字符加上本次接收到的字符串总长度,然后除去首部跟尾部,得到实际有用的数据。

四. 协议原理:在每次收到数据之后进行判断,是否为预先设定的反馈数据,如果是,则不做处理,如果不是,则进行发送反馈数据操作。每次发送完数据对话框有提示“数据已发送“,当收到反馈数据时,提示”数据已成功接收“。

五. 主要问题:单次发送的数据不能大于33个字符,否则会接收不正常。波特率已加到程序里面固定为“115200“,如果太小了可能会出现接收不到信息或者接收速度慢等情况。

六. 界面图示:

1.发送完数据,但是对方未收到。

串口通信

2 2.发送完数据,对方已经成功接收。

七. 部分代码

界面设计

类向导中的函数设计 串口通信

3

“serilDlg.cpp”文件内部代码

#include "stdafx.h"

#include "seril.h"

#include "serilDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

int comseril;

/////////////////////////////////////////////////////////////////////////////

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

串口通信

4 // Dialog Data

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

//{{AFX_DATA_INIT(CAboutDlg)

//}}AFX_DATA_INIT

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

// No message handlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP() 串口通信

5

/////////////////////////////////////////////////////////////////////////////

// CSerilDlg dialog

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

// Note that LoadIcon does not require a subsequent DestroyIcon in Win32

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CSerilDlg::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) 串口通信

6 ON_CBN_CLOSEUP(IDC_COM, OnCloseupCom)

ON_BN_CLICKED(IDC_FASONG, OnFasong)

ON_BN_CLICKED(IDC_OPENSERIL, OnOpenseril)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CSerilDlg message handlers

BOOL CSerilDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

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

// when the application's main window is not a dialog

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon 串口通信

7

// TODO: Add extra initialization here

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

}

void CSerilDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog::OnSysCommand(nID, lParam);

}

}

// If you add a minimize button to your dialog, you will need the code below

// to draw the icon. For MFC applications using the document/view model,

// this is automatically done for you by the framework.

void CSerilDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);