⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scommtestdlg.cpp

📁 这是一个串口通信的主机例程
💻 CPP
字号:
// SCommTestDlg.cpp : implementation file
//

#include "stdafx.h"
#include "chuankou.h"
#include "SCommTestDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
UINT m_timerID1;
UINT m_timerID2;
/////////////////////////////////////////////////////////////////////////////
// CSCommTestDlg dialog


CSCommTestDlg::CSCommTestDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CSCommTestDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CSCommTestDlg)
	m_strEditRXData = _T("");
	m_strEditTXData = _T("");
    m_Distencechoice=0;
	Send_connection=true;   //握手发送成功标志
	m_detectdisdelay = 0;
	m_Restdelay = 0;
	Isdetectdistence=false;
	//}}AFX_DATA_INIT
}


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);
	DDX_Text(pDX, IDC_EDIT3, m_detectdisdelay);
	DDX_Text(pDX, IDC_EDIT4, m_Restdelay);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CSCommTestDlg, CDialog)
	//{{AFX_MSG_MAP(CSCommTestDlg)
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_BN_CLICKED(IDC_RADIO1, OnSigledistence)
	ON_BN_CLICKED(IDC_RADIO2, OnRepeatdistence)
	ON_BN_CLICKED(IDC_DISTENCE, OnDistence)
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSCommTestDlg message handlers



BOOL CSCommTestDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	m_ctrlComm.SetCommPort(2);    //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
	
	CString shakeachievereturn="0xAA0xAA0xAA0xAA0xAA0xAA0xAA0xAA0xAA0xAA";
	CString shakefailreturn="connection is fail";
	VARIANT variant_inp;
	COleSafeArray safearray_inp;
	LONG len,k;
	BYTE rxdata[2048];  //设置BYTE数组
    CString strtemp;
	if(m_ctrlComm.GetCommEvent()==2)  //事件为2表示接收缓冲区内有字符
	{
		variant_inp=m_ctrlComm.GetInput();  //读缓冲区
		safearray_inp=variant_inp;  //VARIANT型变量转换为ColeSafeArray型变量
		len=safearray_inp.GetOneDimSize();    //得到有效数据长度
		for(k=0;k<len;k++)
		{
			safearray_inp.GetElement(&k,rxdata+k);
		}
		for(k=0;k<len;k++)
		{
			BYTE bt=*(char*)(rxdata+k);  //字符型
			strtemp.Format("%c",bt);  //将字符送入临时变量strtemp存放
			m_strEditRXData+=strtemp;
		}
		for(k=0;k<10;k++)
		{
			if(rxdata[k]!=0xAA)
				Send_connection=false;
		}
		if(!Send_connection)
		{
            m_ctrlComm.SetOutput(COleVariant(shakefailreturn));
		}
	   
		
	}
	UpdateData(FALSE);   //更新编辑框内容
}

void CSCommTestDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);    //读取编辑框内容
	unsigned char shakesendmessage=0x55;
    for(int k=0;k<10;k++)	
	{
	   m_ctrlComm.SetOutput(COleVariant((CString)shakesendmessage));  //发送数据
	}
	

	
}

void CSCommTestDlg::OnSigledistence() 
{
	// TODO: Add your control notification handler code here
	m_Distencechoice=1;    //单次测距
}

void CSCommTestDlg::OnRepeatdistence() 
{
	// TODO: Add your control notification handler code here
	m_Distencechoice=2;    //重复测距
}

void CSCommTestDlg::OnDistence() 
{
	// TODO: Add your control notification handler code here
	if(!Isdetectdistence)
	{
		Isdetectdistence=true;
	}
	else
	{
		Isdetectdistence=false;
	}
	CString DetectDistencebeginCommand="0xC0";
	CString DetectDistenceoverCommand="0xB0";
	
	if(m_Distencechoice==1)
	{
		m_ctrlComm.SetOutput(COleVariant(DetectDistencebeginCommand));  //发送测距开始指令
	}
	if(m_Distencechoice==2)
	{
		if(Isdetectdistence)
		{
			m_ctrlComm.SetOutput(COleVariant(DetectDistencebeginCommand));  //发送测距开始指令
			m_timerID1 = this->SetTimer(1,1000,NULL);   //开始计时,直到32s
		}
		else
		{
             m_ctrlComm.SetOutput(COleVariant(DetectDistenceoverCommand));  //发送测距开始指令
             KillTimer(m_timerID1);//可以在需要停止定时器的地方KillTimer
			 m_detectdisdelay=0;
		}
	}
	
}

void CSCommTestDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	switch (nIDEvent)
	{
	case 1:
		Draw1();
		break;
		
	case 2:
		Draw2();
		break;
	}
	
	CDialog::OnTimer(nIDEvent);
}

void CSCommTestDlg::Draw1()
{
	m_detectdisdelay++;
	
	UpdateData(false);
	
	if (m_detectdisdelay>=32)
	{
		KillTimer(m_timerID1);//可以在需要停止定时器的地方KillTimer
		m_timerID2 = this->SetTimer(2,1000,NULL);
	}
	
}

void CSCommTestDlg::Draw2()
{
	m_Restdelay++;
	
	UpdateData(false);
	
	if (m_Restdelay>=10)
		KillTimer(m_timerID2);//可以在需要停止定时器的地方KillTimer
}





















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -