花了幾天時間總算是搞清楚了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類的例子 目標 讓應用程式處理這裡所見的命令...