scommtestdlg.cpp
来自「这是一个串口通信的下位机例程」· C++ 代码 · 共 155 行
CPP
155 行
// SCommTestDlg.cpp : implementation file
//
#include "stdio.h"
#include "stdafx.h"
#include "chuankou.h"
#include "SCommTestDlg.h"
#include "malloc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CString distence="0x03e8";
int numberbegin=0;
int datalength=0;
/////////////////////////////////////////////////////////////////////////////
// CSCommTestDlg dialog
//int count=0;
CSCommTestDlg::CSCommTestDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSCommTestDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSCommTestDlg)
m_strEditRXData = _T("");
m_strEditTXData = _T("");
m_detectdistence=false;
//}}AFX_DATA_INIT
RXdata=(unsigned char *)malloc(1024);
}
void CSCommTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSCommTestDlg)
DDX_Control(pDX, IDC_MSCOMM1, m_ctrlComm);
DDX_Text(pDX, IDC_EDIT1, m_strEditRXData);
DDX_Text(pDX, IDC_EDIT2, m_strEditTXData);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSCommTestDlg, CDialog)
//{{AFX_MSG_MAP(CSCommTestDlg)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSCommTestDlg message handlers
BOOL CSCommTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_ctrlComm.SetCommPort(1); //choose com1
m_ctrlComm.SetInputMode(1);
m_ctrlComm.SetInBufferSize(1024);
m_ctrlComm.SetOutBufferSize(512);
m_ctrlComm.SetSettings("9600,n,8,1");
if(!m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(TRUE); //open the com
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
// EXCEPTION: OCX Property Pages should return FALSE
}
BEGIN_EVENTSINK_MAP(CSCommTestDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CSCommTestDlg)
ON_EVENT(CSCommTestDlg, IDC_MSCOMM1, 1 /* OnComm */, OnComm, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
void CSCommTestDlg::OnComm()
{
// TODO: Add your control notification handler code here
BOOL Send_connection=FALSE; //握手发送成功标志
CString shakeachievereturn="0xAA";
CString shakefailreturn="connection is fail";
CString datahead="0xAA";
CString dataend="0xDD";
VARIANT variant_inp;
BYTE *rxdata;
rxdata=new BYTE[1024];
COleSafeArray safearray_inp;
LONG len,k;
//设置BYTE数组
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件为2表示接收缓冲区内有字符
{
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
if(len==10)
{
for(k=0;k<len;k++)
{
safearray_inp.GetElement(&k,rxdata+k);
}
k=0;
while(k<10&&rxdata[k]==0x55)
{k++;}
if(k==10)
{
for(k=0;k<10;k++)
{
m_ctrlComm.SetOutput(COleVariant(shakeachievereturn));
}
}
}
else
{
m_ctrlComm.SetOutput(COleVariant(shakefailreturn));
}
for(k=0;k<len;k++)
{
if(rxdata[k]==0xC0)
{
m_detectdistence=true;
}
}
if(m_detectdistence)
{
m_ctrlComm.SetOutput(COleVariant(datahead+distence+dataend));
}
for(k=0;k<len;k++)
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%x",bt); //将字符送入临时变量strtemp存放
m_strEditRXData+=strtemp;
}
}
UpdateData(FALSE); //更新编辑框内容
}
void CSCommTestDlg::OnButton1()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE); //读取编辑框内容
m_ctrlComm.SetOutput(COleVariant(m_strEditTXData)); //发送数据
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?