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 + -
显示快捷键?