dlggongzhuang.cpp
来自「串口收发工具」· C++ 代码 · 共 1,053 行 · 第 1/2 页
CPP
1,053 行
editGzNo.GetWindowText(strTemp);
byBufTemp[8] = BYTE(atoi(strTemp));
WORD parity = CManager::Crc16Parity(&byBufTemp[1],8);
byBufTemp[9] = (BYTE)LOBYTE(parity);
byBufTemp[10] = (BYTE)HIBYTE(parity);
m_doc = ((CMainFrame*)AfxGetMainWnd())->GetDoc();
if(m_doc)
{
m_doc->SendData(byBufTemp,sizeof(byBufTemp),true);
SetTimer(3,timer3,NULL);
ShowWaitCursor(true);
SendCodeToHEX(byBufTemp,11);
}
}
void CDlgGongzhuang::ShowWaitCursor(bool bShow)
{
if (bShow)
{
m_ChangeCursor = TRUE;
((CMaintainApp*)AfxGetApp())->BeginWaitCursor();
}
else
{
((CMaintainApp*)AfxGetApp())->EndWaitCursor();
m_ChangeCursor = FALSE;
}
}
void CDlgGongzhuang::SPITest()
{
KillTimer(1);
nCurOperation = GONGZHUANG_TEST_SPI;
SetStatusBarInfo("");
BYTE byBufTemp[11];
byBufTemp[0] = 0x7E;
byBufTemp[1] = byGroupNo;
byBufTemp[2] = byAddrNo;
byBufTemp[3] = 2;
byBufTemp[4] = 0;
byBufTemp[5] = 0x70;
byBufTemp[6] = 0;
byBufTemp[7] = 0x03;
CString strTemp;
editGzNo.GetWindowText(strTemp);
byBufTemp[8] = BYTE(atoi(strTemp));
WORD parity = CManager::Crc16Parity(&byBufTemp[1],8);
byBufTemp[9] = (BYTE)LOBYTE(parity);
byBufTemp[10] = (BYTE)HIBYTE(parity);
m_doc = ((CMainFrame*)AfxGetMainWnd())->GetDoc();
if(m_doc)
{
m_doc->SendData(byBufTemp,sizeof(byBufTemp),true);
SetTimer(3,timer3,NULL);
ShowWaitCursor(true);
SendCodeToHEX(byBufTemp,11);
}
}
void CDlgGongzhuang::AddrLineTest()
{
KillTimer(1);
nCurOperation = GONGZHUANG_TEST_ADDRLINE;
SetStatusBarInfo("");
BYTE byBufTemp[11];
byBufTemp[0] = 0x7E;
byBufTemp[1] = byGroupNo;
byBufTemp[2] = byAddrNo;
byBufTemp[3] = 2;
byBufTemp[4] = 0;
byBufTemp[5] = 0x70;
byBufTemp[6] = 0;
byBufTemp[7] = 0x04;
CString strTemp;
editGzNo.GetWindowText(strTemp);
byBufTemp[8] = BYTE(atoi(strTemp));
WORD parity = CManager::Crc16Parity(&byBufTemp[1],8);
byBufTemp[9] = (BYTE)LOBYTE(parity);
byBufTemp[10] = (BYTE)HIBYTE(parity);
m_doc = ((CMainFrame*)AfxGetMainWnd())->GetDoc();
if(m_doc)
{
m_doc->SendData(byBufTemp,sizeof(byBufTemp),true);
SetTimer(3,timer3,NULL);
ShowWaitCursor(true);
SendCodeToHEX(byBufTemp,11);
}
}
void CDlgGongzhuang::BuzzerTest(bool bBeginOrStop)
{
KillTimer(1);
nCurOperation = GONGZHUANG_TEST_BUZZER;
BYTE byBufTemp[11];
byBufTemp[0] = 0x7E;
byBufTemp[1] = byGroupNo;
byBufTemp[2] = byAddrNo;
byBufTemp[3] = 2;
byBufTemp[4] = 0;
byBufTemp[5] = 0x70;
byBufTemp[6] = 0;
byBufTemp[7] = 0x05;
byBufTemp[8] = bBeginOrStop?0:1;
WORD parity = CManager::Crc16Parity(&byBufTemp[1],8);
byBufTemp[9] = (BYTE)LOBYTE(parity);
byBufTemp[10] = (BYTE)HIBYTE(parity);
m_doc = ((CMainFrame*)AfxGetMainWnd())->GetDoc();
if(m_doc)
{
for(int i=0;i<3;i++)
m_doc->SendData(byBufTemp,sizeof(byBufTemp),true);
SendCodeToHEX(byBufTemp,11);
}
}
void CDlgGongzhuang::CommTest()
{
KillTimer(1);
nCurOperation = GONGZHUANG_TEST_COMM;
SetStatusBarInfo("");
BYTE byBufTemp[12];
byBufTemp[0] = 0x7E;
byBufTemp[1] = byGroupNo;
byBufTemp[2] = byAddrNo;
byBufTemp[3] = 3;
byBufTemp[4] = 0;
byBufTemp[5] = 0xf0;//工装功能码为70,上传时最高位为1,即f0
byBufTemp[6] = 0;
//串口测试正确的标准是收发一致,此处为了让返回的数据在处理时方便,自定义了一个扩展功能码ff
//这样返回判断时ff标明是串口测试返回
byBufTemp[7] = 0xff;
byBufTemp[8] = 0;
byBufTemp[9] = 0;
byBufTemp[10] = LOBYTE(CManager::Crc16Parity(&byBufTemp[1],9));
byBufTemp[11] = HIBYTE(CManager::Crc16Parity(&byBufTemp[1],9));
m_doc = ((CMainFrame*)AfxGetMainWnd())->GetDoc();
if(m_doc)
{
m_doc->SendData(byBufTemp,sizeof(byBufTemp),true);
SetTimer(3,timer3,NULL);
ShowWaitCursor(true);
SendCodeToHEX(byBufTemp,11);
}
}
void CDlgGongzhuang::ClockTest()
{
KillTimer(1);
nCurOperation = GONGZHUANG_TEST_CLOCK;
SetStatusBarInfo(_T("时钟测试,设置当前时间..."));
BYTE byBufTemp[18];
byBufTemp[0] = 0x7E;
byBufTemp[1] = byGroupNo;
byBufTemp[2] = byAddrNo;
byBufTemp[3] = 0x09;
byBufTemp[4] = 0x00;
byBufTemp[5] = 0x10;
byBufTemp[6] = 0x00;//基站状态
t = CTime::GetCurrentTime();
byBufTemp[7] = LOBYTE(t.GetYear());
byBufTemp[8] = HIBYTE(t.GetYear());
byBufTemp[9] = t.GetMonth();
byBufTemp[10] = t.GetDay();
byBufTemp[11] = t.GetHour();
byBufTemp[12] = t.GetMinute();
byBufTemp[13] = t.GetSecond();
byBufTemp[14] = 0x00;
byBufTemp[15] = 0x00;
byBufTemp[16] = LOBYTE(CManager::Crc16Parity(&byBufTemp[1],15));
byBufTemp[17] = HIBYTE(CManager::Crc16Parity(&byBufTemp[1],15));
m_doc = ((CMainFrame*)AfxGetMainWnd())->GetDoc();
if(m_doc)
{
m_doc->SendData(byBufTemp,sizeof(byBufTemp),true);
ShowWaitCursor(true);
SendCodeToHEX(byBufTemp,18);
Sleep(2000);
SetStatusBarInfo(_T("时钟测试,召唤时间..."));
//发送完当前时间后召唤时间
memset(byBufTemp,0,sizeof(byBufTemp));
byBufTemp[0] = 0x7E;
byBufTemp[1] = byGroupNo;
byBufTemp[2] = byAddrNo;
byBufTemp[3] = 0;
byBufTemp[4] = 0;
byBufTemp[5] = 0x11;
byBufTemp[6] = 0x00;//
byBufTemp[7] = LOBYTE(CManager::Crc16Parity(&byBufTemp[1],6));
byBufTemp[8] = HIBYTE(CManager::Crc16Parity(&byBufTemp[1],6));
m_doc = ((CMainFrame*)AfxGetMainWnd())->GetDoc();
if(m_doc)
{
m_doc->SendData(byBufTemp,9,true);
SetTimer(3,timer3,NULL);
SendCodeToHEX(byBufTemp,9);
}
}
}
void CDlgGongzhuang::ProcessGzData(BYTE *buf,int len)
{
CString strTemp;
BYTE byHead = 0x7E;
BYTE byFuncCode,byExtendFuncCode;
int i;
CString str;
if ((buf[0]!=byHead)||(buf[1]!=byGroupNo)||(buf[2]!=byAddrNo))//帧头组号站号
return ;
byFuncCode = buf[5]; //功能码
byExtendFuncCode = buf[7]; //扩展功能码
switch(byFuncCode) {
case 0xB0://ycyx return
if (nCurOperation!=GONGZHUANG_TEST_YCYX) return;
nYcCount = buf[7];//yc count
nYxCount = buf[8]*8;//yx count
if(nYcCount>GONGZHUANG_YCOUNT)
nYcCount = GONGZHUANG_YCOUNT;
if (nYxCount>GONGZHUANG_YXOUNT)
nYxCount = GONGZHUANG_YXOUNT;
//取得遥测
for (i=0;i<nYcCount;i++)
{
WORD wTemp = MAKEWORD(buf[2*i+9],buf[2*i+10]);
ycValue[i] = (float)0.1*(wTemp&0x7fff);
if(wTemp&0x8000)
ycValue[i] *= -1;
}
//取得遥信
for(i=0;i<nYxCount/8;i++)
for (int j=0;j<8;j++)
yxValue[i*8+j] = (buf[9+2*buf[7]+i]>>j)&0x1;
SetStatusBarInfo(_T("遥测遥信"));
break;
case 0x91://召唤时钟返回
KillTimer(3);
TimeDelay(MAKEWORD(buf[7],buf[8]),buf[9],buf[10],buf[11],buf[12],buf[13]);
break;
case 0xf0://工装测试返回
switch(byExtendFuncCode) {
case 0x02://I2C return
str = _T("I2C");
break;
case 0x03://SPI return
str = _T("SPI");
break;
case 0x04://addrline return
str = _T("地址线");
break;
case 0x07://yt return
str = _T("遥调");
break;
case 0xff://comm return
str = _T("串口");
break;
default:
break;
}
ShowWaitCursor(false);
if(buf[9])
strRtn = str + GZ_TEST_ERROR;
else
strRtn = str + GZ_TEST_OK;
SetStatusBarInfo(strRtn);
KillTimer(3);
break;
default:
break;
}
}
void CDlgGongzhuang::TimeDelay(int i1,int i2,int i3,int i4,int i5,int i6)
{
CTime tRtn(i1,i2,i3,i4,i5,i6);
CTimeSpan ts = tRtn - t;
if (nCurOperation == GONGZHUANG_TEST_CLOCKCALL)
strRtn.Format("返回时间:%s",tRtn.Format("%Y-%m-%d %H:%M:%S"));
else
strRtn.Format("返回时间:%s(%d秒)",tRtn.Format("%Y-%m-%d %H:%M:%S"),
ts.GetTotalSeconds()-2);
SetStatusBarInfo(strRtn);
ShowWaitCursor(false);
}
void CDlgGongzhuang::OnI2c()
{
// TODO: Add your command handler code here
OnGzycyxOff();
I2CTest();
SetStatusBarInfo(_T("I2C测试..."));
}
void CDlgGongzhuang::OnSpi()
{
// TODO: Add your command handler code here
OnGzycyxOff();
SPITest();
SetStatusBarInfo(_T("SPI测试..."));
}
void CDlgGongzhuang::OnAddressline()
{
// TODO: Add your command handler code here
OnGzycyxOff();
AddrLineTest();
SetStatusBarInfo(_T("地址线测试..."));
}
void CDlgGongzhuang::OnBuzzerOn()
{
// TODO: Add your command handler code here
OnGzycyxOff();
BuzzerTest(1);
SetStatusBarInfo(_T("蜂鸣器测试"));
}
void CDlgGongzhuang::OnBuzzerOff()
{
// TODO: Add your command handler code here
OnGzycyxOff();
BuzzerTest(0);
SetStatusBarInfo(_T("蜂鸣器测试结束"));
}
void CDlgGongzhuang::OnGzclock()
{
// TODO: Add your command handler code here
OnGzycyxOff();
ClockTest();
}
void CDlgGongzhuang::OnGzcomm()
{
// TODO: Add your command handler code here
OnGzycyxOff();
CommTest();
SetStatusBarInfo(_T("串口测试..."));
}
void CDlgGongzhuang::OnGzycyxOn()
{
// TODO: Add your command handler code here
nCurOperation = GONGZHUANG_TEST_YCYX;
t = SetTimer(1,timer1,NULL);
}
void CDlgGongzhuang::OnGzycyxOff()
{
// TODO: Add your command handler code here
KillTimer(1);
nYcCount = 0;
nYxCount = 0;
memset(ycValue,-1000,sizeof(ycValue));
memset(ycValueOld,-2000,sizeof(ycValueOld));
memset(yxValue,-1,sizeof(yxValue));
memset(yxValueOld,-1,sizeof(yxValueOld));
CRect rc;
rc.left = nYcLineLeft;
rc.right = nYcLineLeft+nCellYcWidth*24;
rc.top = ntop+9*nCell;
rc.bottom = ntop+9*nCell+4*nCellYcHigh;
RedrawWindow(rc);
for (int j=0;j<8;j++)
{
for (int i=0;i<8;i++)
{
yxicon[i+j*8].ShowWindow(SW_HIDE);
yxicon[i+j*8].RedrawWindow();
}
}
SetStatusBarInfo(_T("遥测遥信结束"));
BYTE bytemp;
SendCodeToHEX(&bytemp,0);
Sleep(1000);
}
void CDlgGongzhuang::OnGzYkbegin()
{
// TODO: Add your command handler code here
OnGzycyxOff();
YkTestBegin();
SetStatusBarInfo(_T("遥控开始"));
}
void CDlgGongzhuang::OnGzYkend()
{
// TODO: Add your command handler code here
OnGzycyxOff();
YkTestStop();
SetStatusBarInfo(_T("遥控结束"));
}
void CDlgGongzhuang::OnGzYt()
{
// TODO: Add your command handler code here
OnGzycyxOff();
YtTest();
SetStatusBarInfo(_T("遥调操作..."));
}
static CString strSendCodeOld;
void CDlgGongzhuang::SendCodeToHEX(BYTE* buf,int len)
{
strSendCode.Empty();
CString strTemp;
for (int i=0;i<len;i++)
{
strTemp.Format("%02X ",buf[i]);
strSendCode += strTemp;
}
if (strSendCode.Compare(strSendCodeOld)!=0)
{
RedrawWindow(rcSendCode);
strSendCodeOld = strSendCode;
}
}
void CDlgGongzhuang::DrawBitmap(HDC hDC, int nX, int nY, UINT nID)
{
HBITMAP hBitmap,hOldBitmap;
hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(nID),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);
BITMAP bm;
GetObject(hBitmap,sizeof(BITMAP),&bm);
HDC hMemDC = CreateCompatibleDC(hDC);
hOldBitmap = (HBITMAP)SelectObject(hMemDC,hBitmap);
BitBlt(hDC,nX,nY,bm.bmWidth,bm.bmHeight,hMemDC,0,0,SRCCOPY);
SelectObject(hMemDC,hOldBitmap);
DeleteDC(hMemDC);
DeleteObject(hBitmap);
}
void CDlgGongzhuang::DrawTitleOnBmp(HDC hDC, int nX, int nY, CString str)
{
HFONT oldFont = (HFONT)SelectObject(hDC,HFONT(m_font));
int oldMode = GetBkMode(hDC);
SetBkMode(hDC,TRANSPARENT);
TextOut(hDC,nX,nY,str,str.GetLength());
SetBkMode(hDC,oldMode);
SelectObject(hDC,oldFont);
}
BOOL CDlgGongzhuang::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: Add your message handler code here and/or call default
if (m_ChangeCursor)
{
RestoreWaitCursor();
return TRUE;
}
return CFrameWnd::OnSetCursor(pWnd, nHitTest, message);
}
void CDlgGongzhuang::OnGzclockcall()
{
// TODO: Add your command handler code here
OnGzycyxOff();
nCurOperation = GONGZHUANG_TEST_CLOCKCALL;
SetStatusBarInfo(_T("召唤时钟..."));
BYTE byBufTemp[9];
byBufTemp[0] = 0x7E;
byBufTemp[1] = byGroupNo;
byBufTemp[2] = byAddrNo;
byBufTemp[3] = 0;
byBufTemp[4] = 0;
byBufTemp[5] = 0x11;
byBufTemp[6] = 0x00;//
byBufTemp[7] = LOBYTE(CManager::Crc16Parity(&byBufTemp[1],6));
byBufTemp[8] = HIBYTE(CManager::Crc16Parity(&byBufTemp[1],6));
m_doc = ((CMainFrame*)AfxGetMainWnd())->GetDoc();
if(m_doc)
{
m_doc->SendData(byBufTemp,sizeof(byBufTemp),true);
SetTimer(3,timer3,NULL);
ShowWaitCursor(true);
SendCodeToHEX(byBufTemp,9);
}
}
BOOL CDlgGongzhuang::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if ((pMsg->message == WM_MOUSEMOVE)||(pMsg->message == WM_LBUTTONDOWN))
if (m_ChangeCursor)
return true;
return CFrameWnd::PreTranslateMessage(pMsg);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?