接受命令並解析程式碼學習分析

2021-10-10 12:54:35 字數 3053 閱讀 4021

花了幾天時間總算是搞清楚了iexecutecommand這種事情了

此函式用來接收上層下發的命令,解析之後返回某一值,iexecutecommand(接收資料,資料長度,超時時間,回覆資訊,日誌)。

**如下(示例):

byte  bcomreceivebuf[

128]=;

//存放收到的資料資訊

dword bytesread =0;

////傳送指令格式 幀頭(兩個位元組) 長度(1 byte) 命令字 校驗(1 byte) 幀尾(1 byte)

//命令字段的長度不包括校驗位和幀尾

unsigned

char szresult =

0x00

;//校驗值

for(

int i =

2; i <

(int

)dwsendlen; i++

)unsigned

char uzcomsendbuftemp[

128]=;

//傳送的資訊臨時儲存

memcpy

(uzcomsendbuftemp, bcomsendbuf, dwsendlen);//

uzcomsendbuftemp[dwsendlen]

= szresult;

//校驗值

uzcomsendbuftemp[dwsendlen +1]

=0xf0

;//0xf0表示幀尾 資料結束標記

dwsendlen +=2

;//增加後面的校驗位和幀尾兩個位元組

本段程式碼用來組裝接受到的命令資料資訊。先定義字元陣列,用來接收資料,之後將資料存放到臨時的字元陣列中,同時需要計算校驗碼的值,此處校驗碼計算採用位異或運算,將所有的資料,除了幀頭兩個位元組和資料為的位元組以外,在資料長度之內將所有資料與0運算之後,獲得校驗碼的值,之後將校驗碼的值和幀尾的值拼接到此資料命令中,長度增加2.

**如下(示例):

int nwritereadtime =0;

//執行命令讀寫次數限制

dword dwlen =0;

while(1

)else

如果資料寫入失敗則日誌記錄,返回,成功則else

**如下(示例):

else

else

;//記錄日誌 變數陣列

int i =0;

while

(i <=

(int

)(bytesread +2)

)if(bytesread < dwlen +2)

//讀數長度不夠

else

else

break;}

}}

寫入資料成功之後,即命令下發之後,再從埠當中讀取命令。讀取命令的時候判斷長度,是否小於3,應為第三位之後為命令字段,所以以之為界。小於3則表示沒有正確度到命令資料,度無失敗。反之則讀取到資料。讀取到資料之後再次判斷幀頭資訊是否正確。正確之後再次將命令資料全部讀取出來。之後重新計算取到資料的校驗碼值。同時與之前拼接的命令的校驗碼想對比,幀尾資料也相比較。如果都相同,則真確收到資訊並讀取資訊,之後返回相對資料與值。反之則返回失敗資訊。允許迴圈讀取解析三次,超過之後錯誤退出。

**如下(示例):

//解析命令函式,解析之後並返回reply     

dword iexecutecommand

(byte* bcomsendbuf, dword dwsendlen, const dword dwtimeout, lpreply lpreply, dword dwsleep, bool blogtag)

;//存放收到的資料資訊

dword bytesread =0;

////傳送指令格式 幀頭(兩個位元組) 長度(1 byte) 命令字 校驗(1 byte) 幀尾(1 byte)

//命令字段的長度不包括校驗位和幀尾

unsigned

char szresult =

0x00

;//校驗值

for(

int i =

2; i <

(int

)dwsendlen; i++

)unsigned

char uzcomsendbuftemp[

128]=;

//傳送的資訊臨時儲存

memcpy

(uzcomsendbuftemp, bcomsendbuf, dwsendlen);//

uzcomsendbuftemp[dwsendlen]

= szresult;

//校驗值

uzcomsendbuftemp[dwsendlen +1]

=0xf0

;//0xf0表示幀尾 資料結束標記

dwsendlen +=2

;//增加後面的校驗位和幀尾兩個位元組

int nwritereadtime =0;

//執行命令讀寫次數限制

dword dwlen =0;

while(1

)else

else

;//記錄日誌 變數陣列

int i =0;

while

(i <=

(int

)(bytesread +2)

)////logger->debug("cpackerimpl::iexecutecommand readdata %s",sztologdata);

if(bytesread < dwlen +2)

//讀數長度不夠

else

else

break;}

}}}if

(blogtag)

logrecvbuffer

("p"

, bcomreceivebuf, dwlen +5)

;//預設日誌記錄

return hret;

}

自頂向下。選擇目標–>內化輸出–>糾錯學習–>簡化總結!

c 接受命令行 接受命令行挑戰

c 接受命令行 管道非常重要,甚至對於我們在命令列上執行出色任務的能力也至關重要。首先,必須認識到它們是unix早期由douglas mcilroy發明的。謝謝,道格!接下來,在這種情況下,管道是什麼?請注意,在這個簡單的命令列程式中使用了管道,該管道一次列出了每個登入使用者,無論他們有多少次登入都...

R語言接受命令行引數

比如希望對try.r檔案用如下命令列來執行 rscript try.r a 1 b astring 其中引數a是整數,引數b是字串,則 在try.r檔案中可以用 library getopt spec matrix c aparameter a 1,integer bparameter b 1,ch...

MFC程式中如何接受命令行引數

方法一 getcommandline 方法二 for int i 0 i argc i for int i 1 i argc i rcmdinfo.parseparam pszparam,bflag,blast 這裡有個繼承ccommandlineinfo類的例子 目標 讓應用程式處理這裡所見的命令...