?? talktocardlg.cpp
字號(hào):
m_ctrlCommToCar.SetInputLen(0); // 設(shè)置當(dāng)前接收區(qū)數(shù)據(jù)長度為0
m_ctrlCommToCar.GetInput(); // 先預(yù)讀緩沖區(qū)以清除殘留數(shù)據(jù)
m_ucGetBack = m_ucSaveBack; // 初始化接收指針
return(true);
}
// 根據(jù)命令取相應(yīng)數(shù)據(jù),構(gòu)建發(fā)送數(shù)據(jù)幀
void CTalkToCarDlg::makeSendFrame(int iCommand, CByteArray *sendFrame)
{
union
{
UINT all;
BYTE b[4];
}uitemp;
int i;
unsigned short ushDataAddr;
int iRunMode;
BYTE sum = 0;
sendFrame->RemoveAll();
sendFrame->Add(0x55);
sendFrame->Add(0xAA); // 初始化幀頭
sendFrame->Add(CAR_ADDR);
sendFrame->Add(PC_ADDR);
switch (iCommand)
{
case READ_BYTE:
{
sendFrame->Add(0x04); // 幀長
sendFrame->Add(READ_MEMORY); // 命令字
sum += READ_MEMORY;
// 將輸入的 16 進(jìn)制地址轉(zhuǎn)換, 因?yàn)镸51文件中的變量地址通常為 16進(jìn)制
m_szDataAddr.MakeUpper();
ushDataAddr = HexString2ush(m_szDataAddr);
uitemp.all = ushDataAddr; // 數(shù)據(jù)地址
sendFrame->Add(uitemp.b[0]); // 低字節(jié)
sum += uitemp.b[0];
sendFrame->Add(uitemp.b[1]); // 高字節(jié), 只取低 2 字節(jié)
sum += uitemp.b[1];
i = m_ctrlDataType.GetCurSel(); // 讀數(shù)據(jù)類型處理
if( i<= 1)
{
sendFrame->Add(0x01); // 讀有無符號(hào)字節(jié)的字節(jié)數(shù)
sum += 0x01;
}
else
{
if(i <= 3)
{
sendFrame->Add(0x02); // 讀有無符號(hào)整形的字節(jié)數(shù)
sum += 0x02;
}
else
{
sendFrame->Add(0x04); // 讀有符號(hào)長整的字節(jié)數(shù)
sum += 0x04;
}
}
sendFrame->Add(~sum); // 校驗(yàn)和
break;
}
case WRITE_BYTE:
{
sendFrame->Add(0x05); // 幀長
sendFrame->Add(WRITE_MEMORY); // 命令字
sum += WRITE_MEMORY;
// 將輸入的 16 進(jìn)制地址轉(zhuǎn)換, 因?yàn)镸51文件中的變量地址通常為 16進(jìn)制
m_szDataAddr.MakeUpper();
ushDataAddr = HexString2ush(m_szDataAddr);
uitemp.all = ushDataAddr; // 數(shù)據(jù)地址
sendFrame->Add(uitemp.b[0]); // 低字節(jié)
sum += uitemp.b[0];
sendFrame->Add(uitemp.b[1]); // 高字節(jié)
sum += uitemp.b[1];
sendFrame->Add(0x01); // 字節(jié)數(shù)
sum += 0x01;
sendFrame->Add(m_ucWriteData); // 要寫的字節(jié)
sum += m_ucWriteData;
sendFrame->Add(~sum); // 校驗(yàn)和
break;
}
case MOTOR_PWM:
{
sendFrame->Add(0x05); // 幀長
sendFrame->Add(MOTOR_PWM_CTRL); // 命令字
sum += MOTOR_PWM_CTRL;
uitemp.all = m_uiPWM_Val[0]; // 左側(cè)電機(jī)數(shù)據(jù)
sendFrame->Add(uitemp.b[0]); // 低字節(jié)
sum += uitemp.b[0];
sendFrame->Add(uitemp.b[1]); // 高字節(jié)
sum += uitemp.b[1];
uitemp.all = m_uiPWM_Val[1]; // 右側(cè)電機(jī)數(shù)據(jù)
sendFrame->Add(uitemp.b[0]); // 低字節(jié)
sum += uitemp.b[0];
sendFrame->Add(uitemp.b[1]); // 高字節(jié)
sum += uitemp.b[1];
sendFrame->Add(~sum); // 校驗(yàn)和
break;
}
case RUN_STR:
{
iRunMode = m_ctrlRunMode.GetCurSel();
sendFrame->Add(0x05); // 幀長
switch (iRunMode)
{
case 0:
{
sendFrame->Add(RUN_STRAIGHT); // 命令字
sum += RUN_STRAIGHT;
break;
}
case 1:
{
sendFrame->Add(RUN_ON_LINE); // 命令字
sum += RUN_ON_LINE;
m_ctrlRunDir.SetCurSel(0); // 走軌跡只支持前進(jìn)
break;
}
case 2:
{
sendFrame->Add(HOLD_GAP); // 命令字
sum += HOLD_GAP;
m_ctrlRunDir.SetCurSel(0); // 只支持前進(jìn)
break;
}
default: break;
}
CString szButton;
GetDlgItem(IDC_RUN_STRAIGHT) -> GetWindowText(szButton);
if(szButton == "啟動(dòng)")
{
// 啟動(dòng)處理
GetDlgItem(IDC_RUN_STRAIGHT) -> SetWindowText("停止");
if(iRunMode == 2)
{
uitemp.all = m_uiGap2Object; // 取設(shè)定的距離
}
else
{
uitemp.all = m_uiLeftRunNum; // 取行走脈沖定值
}
sendFrame->Add(uitemp.b[0]);
sum += uitemp.b[0];
sendFrame->Add(uitemp.b[1]); // 只取低 2 字節(jié)
sum += uitemp.b[1];
sendFrame->Add(m_ucBase_PWM);
sum += m_ucBase_PWM;
if(m_ctrlRunDir.GetCurSel() == 0)
{
sendFrame ->Add(0); // 設(shè)置 PWM 值方向:前進(jìn)
}
else
{
sendFrame ->Add(0xFF); // 設(shè)置 PWM 值方向:后退
sum += 0xFF;
}
}
else
{
// 停止處理
GetDlgItem(IDC_RUN_STRAIGHT) -> SetWindowText("啟動(dòng)");
sendFrame ->Add(0);
sendFrame ->Add(0);
sendFrame ->Add(BRAKE_PWM); // 發(fā)送剎車PWM值作為基值
sum +=BRAKE_PWM;
sendFrame ->Add(0); // PWM值高字節(jié)為0
}
sendFrame->Add(~sum); // 校驗(yàn)和
break;
}
case READ_SAMPLE:
{
sendFrame->Add(0x04); // 幀長
sendFrame->Add(READ_MEMORY); // 命令字
sum += READ_MEMORY;
// 將輸入的 16 進(jìn)制地址轉(zhuǎn)換, 因?yàn)镸51文件中的變量地址通常為 16進(jìn)制
m_szSampleAddr.MakeUpper();
ushDataAddr = HexString2ush(m_szSampleAddr);
uitemp.all = ushDataAddr; // 數(shù)據(jù)地址
sendFrame->Add(uitemp.b[0]); // 低字節(jié)
sum += uitemp.b[0];
sendFrame->Add(uitemp.b[1]); // 高字節(jié), 只取低 2 字節(jié)
sum += uitemp.b[1];
sendFrame->Add(0x05); // 讀 5 字節(jié)
sum += 0x05;
sendFrame->Add(~sum); // 校驗(yàn)和
break;
}
case READ_DIS:
{
sendFrame->Add(0x04); // 幀長
sendFrame->Add(READ_MEMORY); // 命令字
sum += READ_MEMORY;
// 將輸入的 16 進(jìn)制地址轉(zhuǎn)換, 因?yàn)镸51文件中的變量地址通常為 16進(jìn)制
m_szDisValAddr.MakeUpper();
ushDataAddr = HexString2ush(m_szDisValAddr);
uitemp.all = ushDataAddr; // 數(shù)據(jù)地址
sendFrame->Add(uitemp.b[0]); // 低字節(jié)
sum += uitemp.b[0];
sendFrame->Add(uitemp.b[1]); // 高字節(jié), 只取低 2 字節(jié)
sum += uitemp.b[1];
sendFrame->Add(0x09); // 讀 9 字節(jié)
sum += 0x09;
sendFrame->Add(~sum); // 校驗(yàn)和
break;
}
default: break;
}
m_szCommandBack = "失敗";
this->UpdateData(false);
}
// 電機(jī) PWM 控制處理
void CTalkToCarDlg::OnPWM_Out()
{
// TODO: Add your control notification handler code here
this->UpdateData(true); // 將對(duì)話框中的地址等數(shù)據(jù)取回
if(open_CommPort())
{
m_uiPWM_Val[0] = m_ucMotorL_PWM;
m_uiPWM_Val[1] = m_ucMotorR_PWM;
switch(m_ctrlMotor_L.GetCurSel())
{
case FORWARD:
{
break;
}
case BACKWARD:
{
m_uiPWM_Val[0] +=0xFF00;
break;
}
case FLOAT_C:
{
m_uiPWM_Val[0] =FLOAT_PWM;
break;
}
case BRAKE_C:
{
m_uiPWM_Val[0] =BRAKE_PWM;
break;
}
default: break;
}
switch(m_ctrlMotor_R.GetCurSel())
{
case FORWARD:
{
break;
}
case BACKWARD:
{
m_uiPWM_Val[1] +=0xFF00;
break;
}
case FLOAT_C:
{
m_uiPWM_Val[1] =FLOAT_PWM;
break;
}
case BRAKE_C:
{
m_uiPWM_Val[1] =BRAKE_PWM;
break;
}
default: break;
}
makeSendFrame(MOTOR_PWM, &m_baSendFrame); // 構(gòu)建發(fā)送幀
m_iRcvStat = NO_RCV; // 初始化接收狀態(tài)
m_ctrlCommToCar.SetOutput((COleVariant)m_baSendFrame); // 啟動(dòng)發(fā)送
m_baSendFrame.RemoveAll();
}
else
{
m_ctrlCommToCar.SetPortOpen(false);
}
}
// 電機(jī)剎車處理
void CTalkToCarDlg::OnBrake()
{
// TODO: Add your control notification handler code here
if(open_CommPort())
{
m_uiPWM_Val[0] = BRAKE_PWM;
m_uiPWM_Val[1] = BRAKE_PWM;
makeSendFrame(MOTOR_PWM, &m_baSendFrame); // 構(gòu)建發(fā)送幀
m_iRcvStat = NO_RCV; // 初始化接收狀態(tài)
m_ctrlCommToCar.SetOutput((COleVariant)m_baSendFrame); // 啟動(dòng)發(fā)送
m_baSendFrame.RemoveAll();
}
else
{
m_ctrlCommToCar.SetPortOpen(false);
}
}
// 電機(jī)惰行處理
void CTalkToCarDlg::OnFloat()
{
// TODO: Add your control notification handler code here
if(open_CommPort())
{
m_uiPWM_Val[0] = FLOAT_PWM;
m_uiPWM_Val[1] = FLOAT_PWM;
makeSendFrame(MOTOR_PWM, &m_baSendFrame); // 構(gòu)建發(fā)送幀
m_iRcvStat = NO_RCV; // 初始化接收狀態(tài)
m_ctrlCommToCar.SetOutput((COleVariant)m_baSendFrame); // 啟動(dòng)發(fā)送
m_baSendFrame.RemoveAll();
}
else
{
m_ctrlCommToCar.SetPortOpen(false);
}
}
// 走直線測(cè)試
void CTalkToCarDlg::OnRunStraight()
{
// TODO: Add your control notification handler code here
this->UpdateData(true); // 將對(duì)話框中的地址等數(shù)據(jù)取回
if(open_CommPort())
{
makeSendFrame(RUN_STR, &m_baSendFrame); // 構(gòu)建發(fā)送幀
m_iRcvStat = NO_RCV; // 初始化接收狀態(tài)
m_ctrlCommToCar.SetOutput((COleVariant)m_baSendFrame); // 啟動(dòng)發(fā)送
m_baSendFrame.RemoveAll();
}
else
{
m_ctrlCommToCar.SetPortOpen(false);
}
}
// 因?yàn)樽x采樣值同樣需要將 HEX 碼地址轉(zhuǎn)換為 unsigned short 值,
// 所以將前面的處理變成函數(shù)
unsigned short CTalkToCarDlg::HexString2ush(CString szHexVal)
{
BYTE ucVal,ucLen;
unsigned short ushDataAddr;
int i;
ushDataAddr = 0;
ucLen = szHexVal.GetLength(); // 得到輸入的地址長度
if(ucLen >4 )
{
ucLen = 4; // 只處理 4 位
}
for(i =0; i<ucLen; i++)
{
ushDataAddr = ushDataAddr *16;
ucVal = (BYTE) (szHexVal[i]);
if(ucVal > 0x39)
{
ushDataAddr += ucVal - 0x41+10; // 轉(zhuǎn)換 A - F
}
else
{
ushDataAddr += ucVal - 0x30; // 轉(zhuǎn)換 0 - 9
}
}
return (ushDataAddr) ;
}
/*
讀取采樣處理相關(guān)數(shù)據(jù):4 路采樣模擬量的 AD 結(jié)果(8位),以及由此而產(chǎn)生的邏輯值
直接使用讀內(nèi)存功能,根據(jù) M51 得到 AD 結(jié)果存放的地址。
注意:為了可以使用一幀命令讀出 AD 結(jié)果和邏輯值,在單片機(jī)程序設(shè)計(jì)時(shí)將邏輯值和
AD 的結(jié)果放在一個(gè)數(shù)組中!!!
*/
void CTalkToCarDlg::OnReadSample()
{
// TODO: Add your control notification handler code here
this->UpdateData(true); // 將對(duì)話框中的地址等數(shù)據(jù)取回
if(open_CommPort())
{
m_iReadMemContent = SAMPLE_DATA;
makeSendFrame(READ_SAMPLE, &m_baSendFrame); // 構(gòu)建發(fā)送幀
m_iRcvStat = NO_RCV; // 初始化接收狀態(tài)
m_ctrlCommToCar.SetOutput((COleVariant)m_baSendFrame); // 啟動(dòng)發(fā)送
m_baSendFrame.RemoveAll();
}
else
{
m_ctrlCommToCar.SetPortOpen(false);
}
}
// 因?yàn)樽x內(nèi)存處理太多,為便于閱讀,將各類數(shù)據(jù)變成函數(shù)
// 此為讀通用數(shù)據(jù)的處理
void CTalkToCarDlg::gatGeneralData()
{
union
{
int all;
BYTE b[4];
}itemp;
union
{
short all;
BYTE b[2];
}shtemp;
int iType;
iType = m_ctrlDataType.GetCurSel(); // 獲得數(shù)據(jù)類型
switch(iType) // 根據(jù)數(shù)據(jù)類型處理返回的數(shù)據(jù)
{
case 0:
{
// sign char
m_iReadData = (int)((signed char)m_ucBackBuf[m_ucStartPtr+4]);
break;
}
case 1:
{
// BYTE
shtemp.all =0;
shtemp.b[0] = m_ucBackBuf[m_ucStartPtr+4];
m_iReadData = (int)shtemp.all;
break;
}
case 2:
{
// int
shtemp.b[1] = m_ucBackBuf[m_ucStartPtr+4];
shtemp.b[0] = m_ucBackBuf[m_ucStartPtr+5]; // C51 的整形順序相反
m_iReadData = (int)shtemp.all;
break;
}
case 3:
{
// UINT
itemp.all =0;
itemp.b[1] = m_ucBackBuf[m_ucStartPtr+4];
itemp.b[0] = m_ucBackBuf[m_ucStartPtr+5]; // C51 的整形順序相反
m_iReadData = itemp.all;
break;
}
case 4:
{
// long
itemp.b[4] = m_ucBackBuf[m_ucStartPtr+4];
itemp.b[3] = m_ucBackBuf[m_ucStartPtr+5];
itemp.b[2] = m_ucBackBuf[m_ucStartPtr+6];
itemp.b[1] = m_ucBackBuf[m_ucStartPtr+7]; // C51 的長整形順序相反
m_iReadData = itemp.all;
break;
}
default: break;
}
}
// 讀取軌跡采樣數(shù)據(jù)處理
void CTalkToCarDlg::getSampleData()
{
m_ucSampleVal1 = m_ucBackBuf[m_ucStartPtr+4];
m_ucSampleVal2 = m_ucBackBuf[m_ucStartPtr+5];
m_ucSampleVal3 = m_ucBackBuf[m_ucStartPtr+6];
m_ucSampleVal4 = m_ucBackBuf[m_ucStartPtr+7];
m_ucSensorStat = m_ucBackBuf[m_ucStartPtr+8];
}
// 讀取距離值操作
void CTalkToCarDlg::OnReadDis()
{
// TODO: Add your control notification handler code here
this->UpdateData(true); // 將對(duì)話框中的地址等數(shù)據(jù)取回
if(open_CommPort())
{
m_iReadMemContent = DIS_DATA;
makeSendFrame(READ_DIS, &m_baSendFrame); // 構(gòu)建發(fā)送幀
m_iRcvStat = NO_RCV; // 初始化接收狀態(tài)
m_ctrlCommToCar.SetOutput((COleVariant)m_baSendFrame); // 啟動(dòng)發(fā)送
m_baSendFrame.RemoveAll();
}
else
{
m_ctrlCommToCar.SetPortOpen(false);
}
}
// 取出返回的距離值
void CTalkToCarDlg::getDisData()
{
m_ucDisVal1 = m_ucBackBuf[m_ucStartPtr+4];
m_ucDisVal2 = m_ucBackBuf[m_ucStartPtr+5];
m_ucDisVal3 = m_ucBackBuf[m_ucStartPtr+6];
m_ucDisVal4 = m_ucBackBuf[m_ucStartPtr+7];
m_ucDisVal5 = m_ucBackBuf[m_ucStartPtr+8];
m_ucDisVal6 = m_ucBackBuf[m_ucStartPtr+9];
m_ucDisVal7 = m_ucBackBuf[m_ucStartPtr+10];
m_ucDisVal8 = m_ucBackBuf[m_ucStartPtr+11];
m_ucDisMeanVal = m_ucBackBuf[m_ucStartPtr+12];
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -