📄 dvpview.cpp
字号:
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 + -