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

📄 commtestliudlg.cpp

📁 Windows串行通信程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -