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

📄 dvpview.cpp

📁 郎顿51开发板上位机代码 帮助你快速开发工控程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		str = ConverBufToHex((unsigned char *)(LPCTSTR)str , str.GetLength());
	}
	else
	{
		buf = new unsigned char[str.GetLength() + 1];
		len = ConverHexToBuff(str , buf , str.GetLength());
		buf[len] = 0;
		str = buf;
		delete buf;
	}
	edt->SetWindowText(str);
}
//发送数据,并把数据按照相应格式显示在发送Edit中----------------------------
int CDvpView::SendData(unsigned char * buf , int len)
{
	OpenComPort();

	CEdit * edt = (CEdit *)this->GetDlgItem(IDC_DATA_TX);
	CString str;

	if(this->m_HexTx)
	    str = ConverBufToHex(buf , len);
	else
	{
		char * tbuf = new char[len + 1];
		memcpy(tbuf,buf,len);
		tbuf[len] = 0;		
		str = tbuf;
		delete tbuf;
	}

	edt->SetWindowText(str);

	int re = ((CDvpApp *)AfxGetApp())->SendData(buf,len);
    
	Txcount = Txcount + re;

	UpdateStausBar();
	return re;
}
//--------------------------------响应发送数据事件----------------------------
void CDvpView::OnSendButton() 
{
	// TODO: Add your control notification handler code here
	CString str;
	CEdit * edt = (CEdit *)this->GetDlgItem(IDC_DATA_TX);
	edt->GetWindowText(str);
	unsigned char * buf;
	int len = 0;
	if(this->m_HexTx)
	{
		buf = new unsigned char[str.GetLength() + 1];
		len = ConverHexToBuff(str , buf , str.GetLength());
		SendData(buf,len);
	    
//		RxBuffer->Write(buf,len);
//		DealCmd();
		
		
		delete buf;

	}
	else
	{
		SendData((unsigned char *)str.GetBuffer(0),str.GetLength());
	}
}
//----------------------清除接受区数据----------------------------------------
void CDvpView::OnClrRx() 
{

	// TODO: Add your control notification handler code here
	CEdit * edt = (CEdit *)this->GetDlgItem(IDC_DATA_RX);
	edt->SetWindowText("");
	
}
//----------------------设置时钟读串口数据------------------------------------
void CDvpView::BeginRead()
{
	SetTimer(1,100,NULL);
}
//----------------------kill读串口时钟----------------------------------------
void CDvpView::EndRead()
{
	KillTimer(1);
}
//----------------------响应读串口时钟事件------------------------------------

void CDvpView::OnTimer(UINT nIDEvent) 
{
	CFormView::OnTimer(nIDEvent);

	if(!((CDvpApp *)AfxGetApp())->IsComOpened())
		return;
	
	char buf[1024];
	int cnt = ((CDvpApp *)AfxGetApp())->ReadData(buf,1024);

	Rxcount = Rxcount + cnt;
	UpdateStausBar();	 

	if(cnt > 0)
	{

		RxBuffer->Write(buf,cnt);

		AddStrToRxEdit((unsigned char *)buf , cnt);
		DealCmd();
	
	}
}
//------------------------判断命令是否合法----------------------------------

int CDvpView::JudgeCmd(unsigned char * RxBuf , int Pos , int Size)
{
	if(Size == 0)
		return CMD_LACK;
	unsigned char * buff = RxBuf + Pos;

	if(buff[0] != 0x08)//不是一个命令
		return CMD_NO;

	if(buff[3] > 100) //数据长度不能大于100
	{
		DealErr(-3);
		return CMD_ERROR;
	}

	if(RxBuf[1] + 3 > Size - Pos) //数据没有接收完
		return CMD_LACK;
	
	if(!VerifyData(&buff[1] , buff[1] , (unsigned char)buff[buff[1] + 1]))//效验错
	{
		DealErr(-1);
		return CMD_ERROR;
	}
	if(buff[2 + buff[1]] != 0x09)//没有结束字符
	{
		DealErr(-2);
		return  CMD_ERROR;
	}
	return CMD_YES;
}
//------------------------处理接收到的命令----------------------------------
void CDvpView::DealCmd()
{
	unsigned char * bufp;
	unsigned char command[1024];
	int judge;
	bool  CmdErr = false;
	int size = RxBuffer->GetLength();
	if(size == 0)
		return;
	
	bufp = new unsigned char[size];
	RxBuffer->Seek(0,0);
	RxBuffer->Read(bufp,size);

	for(int i = 0 ; i < size - 5; i++)
	{
		if(bufp[i] != 0x08)
			continue;

		judge = JudgeCmd(bufp , i , size);//判断是否是命令
		
		if(judge == CMD_NO || judge == CMD_ERROR)
			continue;
	
		//未处理的数据拷贝到最前面把不是命令的数据覆盖
		size = size - i;
		memcpy(bufp , bufp + i , size); 
		///

		if(judge == CMD_LACK)
			break;
		
		memcpy(command , bufp + 1 , bufp[1]);//把最前面的一条命令拷贝到command

  	    DispatchCmd(command);

		//未处理的数据拷贝到最前面把已经处理的命令的数据覆盖
		size = size - bufp[1] - 3;
		memcpy(bufp , bufp + bufp[1] +3  , size);
		///

		i = -1;//从头开始分析
	}

	delete RxBuffer;
	RxBuffer = new CMemFile;

	if(size > 0)
	{
		RxBuffer->Write(bufp , size);
	}


	delete bufp;
}
//------------------------命令错误处理----------------------------------

void CDvpView::DealErr(int ErrNo)
{

	CString err = "错误:未知";
	
	switch(ErrNo)
	{
		 case 0x00 :
			 err="错误:数码管";
			  break;

		 case 0x01 :
     		  err="错误:EPRPM";
			  break;
		 
		 case 0x02 :
     		  err="错误:中断1";
			  break;

		 case 0x03 :
     		  err="错误:中断3";
			  break;

		 case 0x04 :
     		  err="错误:矩阵键盘";
			  break;
		 
		 case 0x05 :
     		  err="错误:LED灯";
			  break;
		 
		 case 0x06 :
     		  err="错误:红外";
			  break;
		 
		 case 0x08 :
     		  err="错误:比较器";
			  break;

		 case -1 :
     		  err="错误:校验错";
			  break;
			  
		 case -2 :
     		  err="错误:命令没结束符";
			  break;
			  
		 case -3 :
     		  err="错误:命令长度大于100";
			  break;		 
			
		default:
			break;
	}
	CStatic * dsp =(CStatic *)this->GetDlgItem(IDC_ERR_STATIC);
	dsp->SetWindowText(err);
}
//------------------------分发接收到的命令---------------------------

bool CDvpView::DispatchCmd(unsigned char * cmd)
{
		CStatic * dsp =(CStatic *)this->GetDlgItem(IDC_ERR_STATIC);
	    dsp->SetWindowText("");
	    if(cmd[1] != 0x60)
		{
			DealErr(cmd[2]);
			return false;
		}
	
		switch(cmd[2])//根据设备号分发处理
		{
		 case 0x00 : //数码管/时钟
     		  return DgDevDlg->DealCmd(cmd);
			  break;

		 case 0x01 ://Eprom
     		  return EpDlg->DealCmd(cmd);
			  break;
		 
		 case 0x02 ://中断1
		 case 0x03 ://中断2
     		 return EtcDlg->DealCmd(cmd);
			  break;

		 case 0x04 ://键盘
     		  return KeyDlg->DealCmd(cmd);
			  break;
		 
		 case 0x05 ://LED
     		  return LedDlg->DealCmd(cmd);
			  break;

		 case 0x06 ://红外
	     case 0x09 ://比较器	 
			 return IRDADlg->DealCmd(cmd); 
			  break;
		 default :
				return false;
		}

		return true;
}
//------------------------------------------------
void CDvpView::OnOpenLeddlg() 
{
		LedDlg->ShowWindow(SW_SHOW);	
}
//------------------------------------------------

void CDvpView::OnOpenKeydlg() 
{
		KeyDlg->ShowWindow(SW_SHOW);	
}
//------------------------------------------------

void CDvpView::OnOpenTimerdlg() 
{
		DgDevDlg->ShowWindow(SW_SHOW);	
}

void CDvpView::OnOpenEprom() 
{
		EpDlg->ShowWindow(SW_SHOW);	
}

void CDvpView::OnOpenEtc() 
{
	EtcDlg->ShowWindow(SW_SHOW);	
	
}

void CDvpView::OnOpenIrda() 
{
	IRDADlg->ShowWindow(SW_SHOW);		
}
void CDvpView::UpdateStausBar()
{
	CString str;
	char tmp1[20];
	char tmp2[20];
	itoa(Txcount , tmp1 , 10);
    itoa(Rxcount , tmp2 , 10);
    str = CString("发送:") + CString(tmp1) + CString(" Byte  接收:") + CString(tmp2) + CString(" Byte");
	((CMainFrame *) GetParentFrame())->m_wndStatusBar.SetPaneText(0,str);
}

⌨️ 快捷键说明

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