生活随笔
收集整理的這篇文章主要介紹了
pelco-d协议数据解析示例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
pelco-d協議數據解析示例
2014-08-14 21:57 286人閱讀 收藏 舉報 本文章已收錄于: 分類: 程序編程(12) 作者同類文章X
代碼工人的倉庫(36) 作者同類文章X
代碼生活(42) 作者同類文章X
版權聲明:本文為遲思堂主人李遲原創文章,如轉載請注明,并附帶原文超鏈接地址,謝謝。
前段時間寫了有關pelco協議的一些筆記,后來,有個小模塊是接收pelco格式的數據,然后解析出是什么命令,于是又寫了個簡單的解析函數。這個函數沒什么技術含量。主要思路:
1、逐字節解析,保證每一字節都處理到;
2、找到0xff,此為命令頭;
3、找到命令結束字符,方法是根據pelco命令組裝的算法,——其實就是當某一字節的值是前面幾個的校驗和就結束,有一點要校驗和正確但長度不符合pelco標準的情況,比如出現0x01,0x02,0x03,根據校驗方法是正確的,但它不是正確的命令,pelco文檔有提到命令都是7個字節的,但有的文檔的命令多于7字節,于是,統一用7字節或以上為判斷。
4、結束,找到了一個命令。
代碼如下:
[cpp] view plaincopy print?
static?void?protocol_d(unsigned?char*?buffer,?int?len)??{??????unsigned?char*?tmp?=?NULL;??????int?cksm?=?0;??????unsigned?char?ch?=?0;??????int?tmp_len?=?len;????????int?cmd_len?=?0;??????unsigned?char*?cmd_ptr?=?NULL;????????tmp?=?buffer;????????????while?(tmp_len?>?0)??????{??????????while?(*tmp?!=?0xff)??????????{??????????????tmp++;??????????????tmp_len--;??????????????if?(tmp_len?<=?0)??????????????goto?end;??????????}?????????????cmd_ptr?=?tmp;?????????????????????ch?=?*(++tmp);??????????cksm?+=?ch;??????????cmd_len?=?2;??????????tmp_len--;????????????while?(tmp_len?>?0)??????????{??????????????ch?=?*(++tmp);??????????????cmd_len++;??????????????tmp_len--;??????????????if?(ch?==?cksm?&&?cmd_len?>=?7)??????????????{??????????????????dump_cmd(NULL,?cmd_ptr,?cmd_len);????????????????????????????????????cksm?=?0;??????????????????break;??????????????}??????????????cksm?+=?ch;??????????????cksm?%=?0x100;??????????}????end:??????????;??????}??}?? static void protocol_d(unsigned char* buffer, int len)
{unsigned char* tmp = NULL;int cksm = 0;unsigned char ch = 0;int tmp_len = len;int cmd_len = 0;unsigned char* cmd_ptr = NULL;tmp = buffer;while (tmp_len > 0){while (*tmp != 0xff){tmp++;tmp_len--;if (tmp_len <= 0)goto end;}cmd_ptr = tmp; // 第一個字節ch = *(++tmp);cksm += ch;cmd_len = 2;tmp_len--;while (tmp_len > 0){ch = *(++tmp);cmd_len++;tmp_len--;if (ch == cksm && cmd_len >= 7){dump_cmd(NULL, cmd_ptr, cmd_len);//找到了命令,就可以做其它事情了。 cksm = 0;break;}cksm += ch;cksm %= 0x100;}end:;}
}
測試代碼如下,特意加了些干擾的字符。
[cpp] view plaincopy print?
int?serial_simple_test()??{??#define?LEN?(5*7+2+2+2+3)??????unsigned?char?buffer[LEN]?=?{??????0x11,?0x8,?0xff,?0x01,?0x00,?0x08,?0x00,?0x01,?0x0a,???????0xff,?0x01,?0x00,?0x08,?0x00,?0x02,?0x0b,?0x9,??????0xff,?0x01,?0x00,?0x00,?0x00,?0x00,?0x01,??????0xff,?0x01,?0x00,?0x0c,?0x0d,?0x08,?0x22,0x9,??????0xff,?0x01,?0x00,?0x01,?0x01,?0x03,?0x6,?0x01,?0x05,???????};??????protocol_d(buffer,?LEN);??????return?0;??}?? int serial_simple_test()
{
#define LEN (5*7+2+2+2+3)unsigned char buffer[LEN] = {0x11, 0x8, 0xff, 0x01, 0x00, 0x08, 0x00, 0x01, 0x0a, 0xff, 0x01, 0x00, 0x08, 0x00, 0x02, 0x0b, 0x9,0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01,0xff, 0x01, 0x00, 0x0c, 0x0d, 0x08, 0x22,0x9,0xff, 0x01, 0x00, 0x01, 0x01, 0x03, 0x6, 0x01, 0x05, };protocol_d(buffer, LEN);return 0;
}
李遲記于2014年8月14日
頂
0 踩
0 - 上一篇更新wordpress遇到prepare警告問題的解決
- 下一篇crosstool-ng構建的一個錯誤的解決
我的同類文章
程序編程(12) 代碼工人的倉庫(36) 代碼生活(42) http://blog.csdn.net
- ?GCC編譯警告選項的學習2015-12-11閱讀95
- ?gcc較高版本的一些編譯警告收集2015-05-06閱讀436
- ?遇到一個日志文件變化帶來的文件句柄問題2015-01-25閱讀199
- ?遇到一個gcc編譯器版本導致的運行結果有差異的問題2015-01-17閱讀236
- ?pelco協議及其實現的簡單認識2014-07-03閱讀342
- ?一個可變參數類型檢查的示例2015-05-06閱讀140
- ?參考ethtool寫了個Linux設置、獲取網卡模式的接口2015-03-30閱讀294
- ?再記一下sscanf的一個小問題2015-01-18閱讀237
- ?初識PCI2015-02-09閱讀200
- ?visca協議及其實現的簡單認識2014-06-30閱讀768
更多文章
總結
以上是生活随笔為你收集整理的pelco-d协议数据解析示例的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。