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);