📄 commtestliudlg.cpp
字号:
// CommTestLiuDlg.cpp : implementation file
//
#include "stdafx.h"
#include "CommTestLiu.h"
#include "CommTestLiuDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 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()
/////////////////////////////////////////////////////////////////////////////
// CCommTestLiuDlg dialog
CCommTestLiuDlg::CCommTestLiuDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCommTestLiuDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCommTestLiuDlg)
m_ChannelParameter1 = 0.0f;
m_ChannelParameter2 = 0.0f;
m_Id = 1;
m_ReceiveData = _T("");
m_ChannelValue = 0.0f;
m_SendFrequency = 0.0f;
m_SendVoltage = 0.0f;
m_SendId = 1;
m_Frequency = 0.0f;
m_ChannelValue1 = 0.0f;
m_ChannelValue2 = 0.0f;
m_ChannelValue3 = 0.0f;
m_ChannelValue4 = 0.0f;
m_ChannelValue5 = 0.0f;
m_ChannelValue6 = 0.0f;
m_ChannelValue7 = 0.0f;
m_ChannelValue8 = 0.0f;
m_ChannelValue9 = 0.0f;
m_ChannelValue10 = 0.0f;
m_Sampling = _T("");
m_ChannelParameter3 = 0.0f;
m_ChannelParameter4 = 0.0f;
m_bAutoSend=FALSE;
m_ChannelParameter10 = 0.0f;
m_ChannelParameter5 = 0.0f;
m_ChannelParameter6 = 0.0f;
m_ChannelParameter7 = 0.0f;
m_ChannelParameter8 = 0.0f;
m_ChannelParameter9 = 0.0f;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
AfxInitRichEdit();
AddSign=FALSE;
// buffer.RemoveAll();
}
void CCommTestLiuDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCommTestLiuDlg)
DDX_Text(pDX, IDC_CHANNELPARAMETER1, m_ChannelParameter1);
DDX_Text(pDX, IDC_CHANNELPARAMETER2, m_ChannelParameter2);
DDX_Control(pDX, IDC_MSCOMM1, m_Comm);
DDX_Text(pDX, IDC_ID, m_Id);
DDX_Text(pDX, IDC_RECEIVEDATA, m_ReceiveData);
DDX_Text(pDX, IDC_CHANNELVALUE, m_ChannelValue);
DDX_Text(pDX, IDC_SENDFREQUENCY, m_SendFrequency);
DDX_Text(pDX, IDC_SENDVOLTAGE, m_SendVoltage);
DDX_Text(pDX, IDC_SENDID, m_SendId);
DDX_Text(pDX, IDC_FREQUENCY, m_Frequency);
DDX_Text(pDX, IDC_CHANNELVALUE1, m_ChannelValue1);
DDX_Text(pDX, IDC_CHANNELVALUE2, m_ChannelValue2);
DDX_Text(pDX, IDC_CHANNELVALUE3, m_ChannelValue3);
DDX_Text(pDX, IDC_CHANNELVALUE4, m_ChannelValue4);
DDX_Text(pDX, IDC_CHANNELVALUE5, m_ChannelValue5);
DDX_Text(pDX, IDC_CHANNELVALUE6, m_ChannelValue6);
DDX_Text(pDX, IDC_CHANNELVALUE7, m_ChannelValue7);
DDX_Text(pDX, IDC_CHANNELVALUE8, m_ChannelValue8);
DDX_Text(pDX, IDC_CHANNELVALUE9, m_ChannelValue9);
DDX_Text(pDX, IDC_CHANNELVALUE10, m_ChannelValue10);
DDX_Text(pDX, IDC_SAMPLING, m_Sampling);
DDX_Text(pDX, IDC_CHANNELPARAMETER3, m_ChannelParameter3);
DDX_Text(pDX, IDC_CHANNELPARAMETER4, m_ChannelParameter4);
DDX_Text(pDX, IDC_CHANNELPARAMETER10, m_ChannelParameter10);
DDX_Text(pDX, IDC_CHANNELPARAMETER5, m_ChannelParameter5);
DDX_Text(pDX, IDC_CHANNELPARAMETER6, m_ChannelParameter6);
DDX_Text(pDX, IDC_CHANNELPARAMETER7, m_ChannelParameter7);
DDX_Text(pDX, IDC_CHANNELPARAMETER8, m_ChannelParameter8);
DDX_Text(pDX, IDC_CHANNELPARAMETER9, m_ChannelParameter9);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCommTestLiuDlg, CDialog)
//{{AFX_MSG_MAP(CCommTestLiuDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_SEND, OnSend)
ON_BN_CLICKED(IDC_CLEAR, OnClear)
ON_BN_CLICKED(IDC_RECEIVEAD, OnReceiveAd)
ON_BN_CLICKED(IDC_RECEIVEALL, OnReceiveAll)
ON_BN_CLICKED(IDC_RECEIVECHANNELVALUE, OnReceiveChannelValue)
ON_BN_CLICKED(IDC_RECEIVEFREQUENCY, OnReceiveFrequency)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_CHECKAUTOSEND, OnCheckautosend)
ON_BN_CLICKED(IDC_SIMULATE, OnSimulate)
ON_BN_CLICKED(IDC_SIMU, OnSimu)
ON_BN_CLICKED(IDC_CHECKAUTOSEND2, OnCheckautosend2)
ON_BN_CLICKED(IDC_GIVEPARAMETER, OnGiveparameter)
ON_BN_CLICKED(IDC_CANCEL, OnCancel)
ON_BN_CLICKED(IDC_GIVEFIXEDVALUE, OnGivefixedvalue)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCommTestLiuDlg message handlers
BOOL CCommTestLiuDlg::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
// TODO: Add extra initialization here
if(m_Comm.GetPortOpen())
m_Comm.SetPortOpen(FALSE);
m_Comm.SetCommPort(1); //选择com1
if( !m_Comm.GetPortOpen())
m_Comm.SetPortOpen(TRUE);//打开串口
else
AfxMessageBox("cannot open serial port");
m_Comm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位
m_Comm.SetInputMode(1); // 以二进制方式检取数据
m_Comm.SetRThreshold(1);
//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_Comm.SetInputLen(0); //设置当前接收区数据长度为0
//m_Comm.GetInput();//先预读缓冲区以清除残留数据
return TRUE; // return TRUE unless you set the focus to a control
}
void CCommTestLiuDlg::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 CCommTestLiuDlg::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);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CCommTestLiuDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
BEGIN_EVENTSINK_MAP(CCommTestLiuDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CCommTestLiuDlg)
ON_EVENT(CCommTestLiuDlg, IDC_MSCOMM1, 1 /* OnComm */, OnComm, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
void CCommTestLiuDlg::OnCancel()
{
// TODO: Add your control notification handler code here
CDialog::OnCancel();
}
void CCommTestLiuDlg::OnComm()
{
// TODO: Add your control notification handler code here
int flag=0,head;
VARIANT m_Input1;
COleSafeArray m_Input2;
long len,i,k;
BYTE data[1024]; //BYTE
BYTE Hi,Lo,Th,Fo;
CString str;
CString strTemp;
if(m_Comm.GetCommEvent()==2)//接收缓冲区内有字符
{
m_Input1=m_Comm.GetInput(); //读取缓冲区内的数据 ,返回数据为VARIANT型变量
m_Input2=m_Input1; //将VARIANT型变量转换为COleSafeArray型变量
len=m_Input2.GetOneDimSize();//确定数据长度
for(i=0;i<len;i++)
{m_Input2.GetElement(&i,data+i);//将数据转换为BYTE型数组
}
CString strLen;
strLen.Format("%d || ",len);
CString tempHex;
strTemp="";
for(int nn=0;nn<len;nn++)
{
tempHex.Format(" %2.2X ",data[nn]);
strTemp+=tempHex;
}
m_ReceiveData+=strLen+strTemp+'\n';
/*for(i=0;i<len;i++)//将数组转换为CString型变量
{char a=*(char*)(data+i);
str.Format("%c",a); //a变
m_ReceiveData+=str;
}*/
if(!AddSign)//AddSign为false表明前一个数据报接收完毕,等到接受新的数据包
{
for(k=0;k<len-4;k++)
{
if(data[k]=='$'&&data[k+1]=='$'&&data[k+2]=='$'&&data[k+3]=='$')
{
AddSign=TRUE;//前面表示下位机传送字符,这里表示下位机上传有效数据报开始了
break;
}
}
}
if(AddSign)//为真表明已经收到过一个数据报的开头$$$$但是还没收到结束****
{
// CString str;
// str.Format("bufLen=%d\t len=%d",bufLen,len);
// MessageBox(str);
for(int kk=0;kk<len;kk++)buffer.Add(data[kk]);
// CString str;
// str.Format("bufLen=%d\t len=%d",bufLen,len);
// MessageBox(str);
int bufLen=buffer.GetSize();
if(bufLen>=17)
{
if(buffer.GetAt(bufLen-4)=='*'&&buffer.GetAt(bufLen-3)=='*'&&buffer.GetAt(bufLen-2)=='*'&&buffer.GetAt(bufLen-1)=='*')
{//数据包结束了,数据已经接收完整了,才能进入下面的数据处理
head=0;
AddSign=FALSE;//已经收到数据包的结束了,下回再要进入这个部分需要先接收$$$$
if(buffer.GetAt(head+4)=='D'&&buffer.GetAt(head+5)=='D'&&buffer.GetAt(head+6)=='D'&&buffer.GetAt(head+7)=='D')
{//〉=17接受频率数据包完整
m_Id=buffer.GetAt(head+8);//ID:1个字节
Fo=buffer.GetAt(head+9);//真正的频率数据信息开始
Th=buffer.GetAt(head+10);
Hi=buffer.GetAt(head+11);
Lo=buffer.GetAt(head+12);
long temp;
temp=(Fo<<24)+(Th<<16)+(Hi<<8)+Lo;
m_Frequency=*((float*)(&temp));
}
else if(buffer.GetSize()>=53&&buffer.GetAt(head+4)=='C'&&buffer.GetAt(head+5)=='C'&&buffer.GetAt(head+6)=='C'&&buffer.GetAt(head+7)=='C')
{//〉=53接受通道值数据包完整
m_Id=buffer.GetAt(head+8);//ID:1个字节
float Channel[10];
for(i=0;i<=9;i++)
{Fo=buffer.GetAt(head+9+4*i);
Th=buffer.GetAt(head+10+4*i);
Hi=buffer.GetAt(head+11+4*i);
Lo=buffer.GetAt(head+12+4*i);
long temp;
float temper;
temp=(Fo<<24)+(Th<<16)+(Hi<<8)+Lo;
temper=*((float*)(&temp));
Channel[i]=temper;
}
m_ChannelValue1=Channel[0];////////
m_ChannelValue2=Channel[1];
m_ChannelValue3=Channel[2];
m_ChannelValue4=Channel[3];
m_ChannelValue5=Channel[4];
m_ChannelValue6=Channel[5];
m_ChannelValue7=Channel[6];//????
m_ChannelValue8=Channel[7];
m_ChannelValue9=Channel[8];
m_ChannelValue10=Channel[9];
}
else if(buffer.GetSize()>=813&&buffer.GetAt(head+4)=='B'&&buffer.GetAt(head+5)=='B'&&buffer.GetAt(head+6)=='B'&&buffer.GetAt(head+7)=='B')
{//〉=813接受A/D采样值数据包完整
int Ad[10][40];
m_Id=buffer.GetAt(head+8);//ID:1个字节
for(i=0;i<10;i++)
{ for(int j=0;j<40;j++)
{ int temp;
Hi=buffer.GetAt(head+10+40*i*2+j*2);
Lo=buffer.GetAt(head+9+40*i*2+j*2);
temp=(Hi<<8)+Lo;
Ad[i][j]=temp;
}
}
CString strLong;
strLong.Format("%2.2d号机数据\n",m_Id);
CString strTemper;//放一行AD数
strTemper="";
CString tempTen;//十进制
m_Sampling+=strLong;
for(i=0;i<10;i++)
{ strLong.Format("%2.2d||",i);//此为通道数
strTemper="";
for(k=0;k<40;k++)
{ tempTen.Format("%2d ",Ad[i][k]);
strTemper+=tempTen;
if(k==19)
strTemper+="\n ";
}
m_Sampling+=strLong+strTemper+'\n';
}
}
else if(buffer.GetSize()>=857&&buffer.GetAt(head+4)=='A'&&buffer.GetAt(head+5)=='A'&&buffer.GetAt(head+6)=='A'&&buffer.GetAt(head+7)=='A')//此处设位857有问题:bug????
{ int Ad[10][40];
m_Id=buffer.GetAt(head+8);//ID:1个字节
/* for(i=0;i<10;i++)
{ for(k=0;k<400;k++)
{int temp;
int Value[400];///????????????
Hi=buffer.GetAt(head+9+2*k);
Lo=buffer.GetAt(head+10+2*k);
temp=(Hi<<8)+Lo;
Value[k]=temp;
}
for(k=0;k<40;k++)
{int Value[400];///????????????
Ad[i][k]=Value[k+40*i];
}
} */
for(i=0;i<10;i++)
{ for(int j=0;j<40;j++)
{ int temp;
Hi=buffer.GetAt(head+10+40*i*2+j*2);
Lo=buffer.GetAt(head+9+40*i*2+j*2);
temp=(Hi<<8)+Lo;
Ad[i][j]=temp;
}
}
float Channel[10];
for(i=0;i<=9;i++)
{Fo=buffer.GetAt(head+809+4*i);
Th=buffer.GetAt(head+810+4*i);
Hi=buffer.GetAt(head+811+4*i);
Lo=buffer.GetAt(head+812+4*i);
long temp;
float temper;
temp=((Fo<<24)+(Th<<16)+(Hi<<8)+Lo);
temper=*((float*)(&temp));
Channel[i]=temper;
}
m_ChannelValue1=Channel[0];
m_ChannelValue2=Channel[1];
m_ChannelValue3=Channel[2];
m_ChannelValue4=Channel[3];
m_ChannelValue5=Channel[4];
m_ChannelValue6=Channel[5];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -