我用的serial port類做的串口通信,當接到資料后按協議解包,接收到得數是十六進制的,其中0xAA 0x22 是幀頭0x12 0x22是資料包內容,.我現在要接收并解包,求大神指點。
LONG CTEST1Dlg::OnCommunication(WPARAM ch, LPARAM port)
//LONG CTEST1Dlg::OnComm(WPARAM ch, LPARAM port)
{
if(m_ctrlEditRXData.GetLineCount()>=15)
{
m_strEditRXData.Empty();
UpdateData(FALSE);
}
UpdateData(TRUE);
CString strtemp;
m_strPortRXData +=(char)ch;
DataProcessTemp(m_strPortRXData.Mid(0,2));
m_strEditRXData += ch;
UpdateData(FALSE);
return 0;
}
void CTEST1Dlg::DataProcessTemp(CString stRXData)
{
CString data1,data2;
BYTE db1,db2;
char *temp=(char*)((LPCTSTR)stRXData);
db1=Hex2ten(temp[0]);
db2=Hex2ten(temp[1]);
data1=dtob(db1);
data2=dtob(db2);
if(data1[3]=='1')
state(IDC_STATIC0,0x0000FF00);
else
state(IDC_STATIC0,0xAAAAAAAA);
if(data1[2]=='1')
state(IDC_STATIC1,0x0000FF00);
else
state(IDC_STATIC1,0xAAAAAAAA);
if(data1[1]=='1')
state(IDC_STATIC2,0x0000FF00);
else
state(IDC_STATIC2,0xAAAAAAAA);
if(data1[0]=='1')
state(IDC_STATIC3,0x0000FF00);
else
state(IDC_STATIC3,0xAAAAAAAA);
if(data2[3]=='1')
state(IDC_STATIC4,0x0000FF00);
else
state(IDC_STATIC4,0xAAAAAAAA);
if(data2[2]=='1')
state(IDC_STATIC5,0x0000FF00);
else
state(IDC_STATIC5,0xAAAAAAAA);
if(data2[1]=='1')
state(IDC_STATIC6,0x0000FF00);
else
state(IDC_STATIC6,0xAAAAAAAA);
if(data2[0]=='1')
state(IDC_STATIC7,0x0000FF00);
else
state(IDC_STATIC7,0xAAAAAAAA);
}
uj5u.com熱心網友回復:
密密麻麻的看的眼花。你的問題是什么?
uj5u.com熱心網友回復:
收到就可以根據業務需求決議了啊,同問想問什么問題?逐個位元組判斷,找到資料的主體部分實作相應的業務。
uj5u.com熱心網友回復:
邏輯性問題,怎么組裝的就怎么拆uj5u.com熱心網友回復:
由于使用串行通訊比較慢,為了提高效率會將資料一起放在緩沖區中發送或接收,為了從這個緩沖池中區分資料,通常的處理方法就是發送時為每段資料加上一個資料前綴和后綴,接收端從緩沖區中的資料中查找前綴,找到后再查找后綴,其中的內容為所需要的資料。不知樓主是否為了查找“前綴”?uj5u.com熱心網友回復:
如何獲得積分轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/109606.html
上一篇:socket編程accept()始侄訓傳SOCKET_ERROR
下一篇:多個應用程式之間視窗無法激活
