📄 scommtestdlg.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 + -