?? cf_test_dlg.cpp
字號:
COMMAND.Format("ZLG:%02X%08X%02X",CommandCode,NULL,SectorCount);//將字符送入臨時變量strtemp存放
m_COMM.SetOutput(COleVariant(COMMAND)); //發(fā)送數(shù)據(jù)
}
BEGIN_EVENTSINK_MAP(CCF_TEST_Dlg, CDialog)
//{{AFX_EVENTSINK_MAP(CCF_TEST_Dlg)
ON_EVENT(CCF_TEST_Dlg, IDC_COMM, 1 /* OnComm */, OnCom, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
/***********************************************************
** 函數(shù)名稱: CString IntToASCII(unsigned char input)
** 功能描述: 將兩位的無符號整數(shù)轉(zhuǎn)換為字符串
** 輸 入: unsigned char input : 16進(jìn)制數(shù)
** 輸 出: input 的字符串形式
** 例 如: 0xFF - > "FF"
************************************************************/
CString IntToASCII(unsigned char input)
{
char temp[2];
char exchange;
CString output = "";
itoa(input,temp,16); //結(jié)果高位放于temp[0],低位放于temp[1]
if (temp[1] == 0) //因?yàn)槿绻鹖nput為0x0F 時,結(jié)果為 'F','0';
{ //所以要交換一下temp[1]與temp[0]
exchange = temp[1];
temp[1] = temp[0];
temp[0] = exchange;
}
if (temp[0] == 0) output += "0";
else output += temp[0];
if (temp[1] == 0) output += "0";
else output += temp[1];
return output;
}
/***********************************************************
** 函數(shù)名稱: void StrToHex(CString str,__int16 len,unsigned char *databuff)
** 功能描述: 將一串字符串轉(zhuǎn)換為一串兩位的16進(jìn)制數(shù)
** 輸 入: CString str : 輸入的字符串
__int16 len : 字符串的長度
** 輸 出: unsigned char *databuff : 輸出的16進(jìn)制數(shù)串
** 例 如: "FF" - > 0xFF ; "1236" - > 12 36
** 備 注:len <= 24
************************************************************/
void StrToHex(CString str,__int16 len,unsigned char *databuff)
{
__int16 intdata[12]; //len必須小于等于12
for (__int16 i = 0; i < len; i++)
{
CString StrChar = str.Mid(2 * i,2); //取出其中的兩個字符
sscanf(StrChar,"%x",&intdata[i]); //轉(zhuǎn)換為16進(jìn)制數(shù)
databuff[i] = (unsigned char)intdata[i];
}
}
void CCF_TEST_Dlg::OnCom()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
CString strtemp;
// PIDINFO pIdInfo;
len = m_COMM.GetCommEvent();
if(m_COMM.GetCommEvent()==2) //事件值為2表示接收緩沖區(qū)內(nèi)有字符
{ //以下你可以根據(jù)自己的通信協(xié)議加入處理代碼
variant_inp=m_COMM.GetInput(); //讀緩沖區(qū)
safearray_inp=variant_inp; //VARIANT型變量轉(zhuǎn)換為ColeSafeArray型變量
len=safearray_inp.GetOneDimSize(); //得到有效數(shù)據(jù)長度
for(k=0;k<len;k++,RXDATALEN++)
{
safearray_inp.GetElement(&k,rxdata+RXDATALEN); //轉(zhuǎn)換為BYTE型數(shù)組
}
switch(CommandCode) //指令數(shù)據(jù)處理
{
case 0xE0: // 電機(jī)停止轉(zhuǎn)動
if((RXDATALEN >= 7)&&
(rxdata[0]=='S')&&(rxdata[1]=='T')&&
(rxdata[2]=='A')&&(rxdata[3]=='T')&&
(rxdata[4]=='E')&&(rxdata[5]==':'))
{
RXDATALEN =0;
CommandCode = 0xff;
if(rxdata[6]=='Y')
{
m_Edit_State="電機(jī)停止轉(zhuǎn)動"; //指令執(zhí)行正確
}
else
m_Edit_State="指令執(zhí)行出錯!"; //指令執(zhí)行出錯
}
else
m_Edit_State="指令正在執(zhí)行...";
break;
case 0xE1: // 電機(jī)開始轉(zhuǎn)動
if((RXDATALEN >= 7)&&
(rxdata[0]=='S')&&(rxdata[1]=='T')&&
(rxdata[2]=='A')&&(rxdata[3]=='T')&&
(rxdata[4]=='E')&&(rxdata[5]==':'))
{
RXDATALEN=0;
CommandCode = 0xff;
if(rxdata[6]=='Y')
{
m_Edit_State="硬盤開始轉(zhuǎn)動。"; //指令執(zhí)行正確
}
else
m_Edit_State="指令執(zhí)行出錯"; //指令執(zhí)行出錯
}
else
m_Edit_State="指令正在執(zhí)行...";
break;
case 0x30: //寫扇區(qū)
if((RXDATALEN >= 7)&&
(rxdata[0]=='S')&&(rxdata[1]=='T')&&
(rxdata[2]=='A')&&(rxdata[3]=='T')&&
(rxdata[4]=='E')&&(rxdata[5]==':'))
{
RXDATALEN=0;
CommandCode = 0xff;
if(rxdata[6]=='Y')
{
m_Edit_State="寫扇區(qū)指令執(zhí)行正確。"; //指令執(zhí)行正確
}
else
m_Edit_State="寫扇區(qū)指令執(zhí)行出錯"; //指令執(zhí)行出錯
}
else
m_Edit_State="指令正在執(zhí)行...";
break;
case 0x20: //讀扇區(qū)
if((RXDATALEN == 6)&&
(rxdata[0]=='S')&&(rxdata[1]=='T')&&
(rxdata[2]=='A')&&(rxdata[3]=='T')&&
(rxdata[4]=='E')&&(rxdata[5]==':'))
{
RXDATALEN=0;
CommandCode = 0xff;
if(rxdata[6]=='N')
m_Edit_State="讀扇區(qū)指令執(zhí)行失敗,請檢查設(shè)備是否連接好!"; //指令執(zhí)行出錯
else
m_Edit_State="通訊出錯請重新運(yùn)行開發(fā)板程序!"; //通訊出錯,請重新開始
}
else
if(RXDATALEN >= (UINT)(SectorCount*512+7))
{
if( (rxdata[SectorCount*512+0]=='S')&&
(rxdata[SectorCount*512+1]=='T')&&
(rxdata[SectorCount*512+2]=='A')&&
(rxdata[SectorCount*512+3]=='T')&&
(rxdata[SectorCount*512+4]=='E')&&
(rxdata[SectorCount*512+5]==':'))
{
RXDATALEN=0;
CommandCode = 0xff;
if(rxdata[SectorCount*512+6]=='Y')
{
int i = m_ComboRXData.GetCurSel();
if(i==0)// 16進(jìn)制顯示
{
for(k=0;k<512;k++)
{ BYTE bt;
if((k%0x10)==0)
{
strtemp.Format("%08X:",k); //將字符送入臨時變量strtemp存放
m_Show+=strtemp; //加入接收編輯框?qū)?yīng)字符串
}
bt=*(char*)(rxdata+k);
strtemp.Format("%02X ",bt); //將字符送入臨時變量strtemp存放
m_Show+=strtemp; //加入接收編輯框?qū)?yīng)字符串
}
}
else// ASCII顯示
{
for(k=0;k<512;k++)
{
BYTE bt=*(char*)(rxdata+k);
strtemp.Format("%c",bt); //將字符送入臨時變量strtemp存放
m_Show+=strtemp; //加入接收編輯框?qū)?yīng)字符串
}
}
// IntToASCII
strtemp.Format("%c%c",13,10); //回車,換行
m_Show+=strtemp;
strtemp.Format("%c%c",13,10); //回車,換行
m_Show+=strtemp;
m_Edit_State="讀扇區(qū)指令正常完成。"; //指令執(zhí)行正確
}
}
else
m_Edit_State="通訊出錯請重新運(yùn)行開發(fā)板程序!"; //通訊出錯,請重新開始
}
else
m_Edit_State="正在執(zhí)行...";
break;
case 0xEC: //獲取設(shè)備識別信息
if((RXDATALEN == 6)&&
(rxdata[0]=='S')&&(rxdata[1]=='T')&&
(rxdata[2]=='A')&&(rxdata[3]=='T')&&
(rxdata[4]=='E')&&(rxdata[5]==':'))
{
if(rxdata[6]=='N')
m_Edit_State="獲取設(shè)備信息指令執(zhí)行失敗,請檢查設(shè)備是否連接好!"; //指令執(zhí)行出錯
else
m_Edit_State="通訊出錯請重新運(yùn)行開發(fā)板程序!"; //通訊出錯,請重新開始
}
if( RXDATALEN >= 64+7) //只接收設(shè)備型號(40字節(jié))、序列號(20字節(jié))、扇區(qū)總數(shù)(4字節(jié))等信息
if( (rxdata[64]=='S')&&
(rxdata[65]=='T')&&
(rxdata[66]=='A')&&
(rxdata[67]=='T')&&
(rxdata[68]=='E')&&
(rxdata[69]==':'))
{
RXDATALEN=0;
CommandCode = 0xff;
if(rxdata[70]=='Y')
{
for(k=0;k<20;k+=2) //將數(shù)組轉(zhuǎn)換為Cstring型變量
{ //注意設(shè)備型號為大端
BYTE bt=*(char*)(rxdata+k+1);
strtemp.Format("%c",bt); //將字符送入臨時變量strtemp存放
m_Model_Number+=strtemp; //加入接收編輯框?qū)?yīng)字符串
bt=*(char*)(rxdata+k);
strtemp.Format("%c",bt);
m_Model_Number+=strtemp; //加入接收編輯框?qū)?yīng)字符串
}
for(k=20;k<40;k+=2) //將數(shù)組轉(zhuǎn)換為Cstring型變量
{ //注意設(shè)備型號為大端
BYTE bt=*(char*)(rxdata+k+1);
strtemp.Format("%c",bt); //將字符送入臨時變量strtemp存放
m_Model_Number2+=strtemp; //加入接收編輯框?qū)?yīng)字符串
bt=*(char*)(rxdata+k);
strtemp.Format("%c",bt);
m_Model_Number2+=strtemp; //加入接收編輯框?qū)?yīng)字符串
}
for(k=40;k<60;k+=2) //將數(shù)組轉(zhuǎn)換為Cstring型變量
{ //注意設(shè)備序列號為大端
BYTE bt=*(char*)(rxdata+k+1);
strtemp.Format("%c",bt); //將字符送入臨時變量strtemp存放
m_Serial_Number+=strtemp; //加入接收編輯框?qū)?yīng)字符串
bt=*(char*)(rxdata+k);
strtemp.Format("%c",bt);
m_Serial_Number+=strtemp; //加入接收編輯框?qū)?yīng)字符串
}
TotlaSectors = rxdata[60]+
rxdata[61]*0x100+
rxdata[62]*0x10000+
rxdata[63]*0x1000000;
m_TotalSector.Format("0x%X",TotlaSectors);
m_Edit_State="獲取設(shè)備信息指令完成。"; //指令執(zhí)行正確
}
else
m_Edit_State="獲取設(shè)備信息指令執(zhí)行失敗,請檢查設(shè)備是否連接好!"; //指令執(zhí)行出錯
}
else
m_Edit_State="指令正在執(zhí)行...";
break;
default:
break;
}
}
// int temp = sizeof(IDINFO);
// memcpy((PIDINFO)&IdInfo, rxdata, sizeof(IDINFO)); //拷貝內(nèi)存
UpdateData(FALSE); //更新編輯框內(nèi)容
}
void CCF_TEST_Dlg::OnSelchangeComport()
{
int i = m_COMPort.GetCurSel();
if(i==0)
{
if(m_COMM.GetPortOpen())
m_COMM.SetPortOpen(FALSE);
m_COMM.SetCommPort(1); //選擇com1
if( !m_COMM.GetPortOpen())
{
m_COMM.SetPortOpen(TRUE);//打開串口
CString COMMAND;
CommandCode = 0xEC;
SectorCount = 1;
COMMAND.Format("ZLG:%02X%08X%02X",CommandCode,NULL,SectorCount);//將字符送入臨時變量strtemp存放
m_COMM.SetOutput(COleVariant(COMMAND)); //發(fā)送數(shù)據(jù)
m_Model_Number="";
m_Model_Number2="";
m_Serial_Number="";
}
else
AfxMessageBox("cannot open serial port");
}
if(i==1)
{
if(m_COMM.GetPortOpen())
m_COMM.SetPortOpen(FALSE);
m_COMM.SetCommPort(2); //選擇com1
if( !m_COMM.GetPortOpen())
{
m_COMM.SetPortOpen(TRUE);//打開串口
CString COMMAND;
CommandCode = 0xEC;
SectorCount = 1;
COMMAND.Format("ZLG:%02X%08X%02X",CommandCode,NULL,SectorCount);//將字符送入臨時變量strtemp存放
m_COMM.SetOutput(COleVariant(COMMAND)); //發(fā)送數(shù)據(jù)
m_Model_Number="";
m_Model_Number2="";
m_Serial_Number="";
}
else
AfxMessageBox("cannot open serial port");
}
}
void CCF_TEST_Dlg::OnSelchangeByteType()
{
// TODO: Add your control notification handler code here
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -