日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pelco-d协议数据解析示例

發布時間:2025/5/22 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pelco-d协议数据解析示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

pelco-d協議數據解析示例

286人閱讀 評論(0) 收藏 舉報 本文章已收錄于: 分類: 程序編程(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

        我的同類文章

        程序編程(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协议数据解析示例的全部內容,希望文章能夠幫你解決所遇到的問題。

        如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。