<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ![](https://img.kancloud.cn/f1/54/f154ffe7cdd2df183f3c2d20ac35a03e_832x592.png =600x) 雖然是C++,但是我們的寫法是嵌入式C++的方式,非常貼近C語言,僅僅使用了C++最基礎的特性,如果大家想把C++改成C語言,按照繼承邏輯就可以了。 ### 接口中的commit是發送數據用的,payload是用戶數據,調用該接口會自動打包成串口數據協議格式的數據。 ### 這個類里面最重要的是on\_stream和on\_packet,其它函數都是解析報文后的用戶層面邏輯,on\_stream是用來解析流數據的,也就是收到串口數據后,判斷是否是完整的報文,具體代碼如下: ![](https://img.kancloud.cn/2e/80/2e80ff125c036494432e37a1c2c672ba_832x676.png =600x) ### 代碼的邏輯就是不斷地探測buffer,直到報文格式完整(注意:這里并不會判斷數據是否出錯,只保證是一個完整包)為止。當然還有個地方有待完善,就是不同revision的判斷也是有差別的,這個大家可以進行修改。 ### 接著就是on\_packet了: ### ``` 1.void?zb_msg::on_packet(const?char?*data,?uint16_t?len)?? 2.{?? 3.????if?(len?<?4?||?!(data[0]?==?0xFE?&&?data[1]?==?0x01?&&?data[2]?==?0xA0?&&?data[3]?==?0xBC))?return;?? 4.?? 5.????/*?CRC16?*/?? 6.????uint16_t?crc16?=?((uint16_t)data[len-2]?<<?8)?|?(uint16_t)data[len-1];?? 7.?? 8.????/*?Check?CRC16?*/?? 9.????if?(crc16?!=?crc16_x25((const?uint8_t?*)data,?len?-?2))?return;?? 10.?? 11.????/*?Revision?*/?? 12.????uint8_t?revision?=?data[4];?? 13.?? 14.????/*?Access?control:?control?flag?*/?? 15.????uint8_t?actrl?=?data[5];?? 16.?? 17.????if?(actrl?&?ZB_MSG_ACTRL_SYNC)?{?? 18.????????if?(revision?>?this->revision_)?this->commit(NULL,?0,?(uint16_t)ZB_MSG_ACTRL_SYNC?<<?8,?255);?? 19.????????else?this->revision_?=?revision;?? 20.?? 21.????????return;?? 22.????}?? 23.?? 24.????if?(revision?>?this->revision_)?{?this->commit(NULL,?0,?(uint16_t)ZB_MSG_ACTRL_REVISION_ERR?<<?8,?0xFF);?return;?}?? 25.?? 26.????if?(revision?==?0x00)?{?? 27.????????/*?Access?control:?data?flag?*/?? 28.????????uint8_t?adata?=?data[6];?? 29.?? 30.????????/*?Seq?*/?? 31.????????uint8_t?seq?=?data[7];?? 32.?? 33.????????/*?Payload?length?*/?? 34.????????uint16_t?size?=?((uint16_t)data[8]?<<?8)?|?(uint16_t)data[9];?? 35.?? 36.????????if?(actrl?&?ZB_MSG_ACTRL_ACK_REQ)?this->commit(NULL,?0,?(uint16_t)ZB_MSG_ACTRL_ACK_RSP?<<?8,?seq);?? 37.?? 38.????????this->handle((const?uint8_t?*)&data[10],?size);?? 39.?? 40.????????(void)adata;?? 41.????}?? 42.} ``` ### 代碼邏輯比較簡單,檢測完整性,判斷revision進行兼容,并處理訪問控制符,最后把用戶數據交給handle去處理。復雜一點我們還可以根據訪問控制進行分幀處理,訪問控制符的標識我們可以自己定義,比如定義同步報文,定義是否需要響應標識等。 ### 然后我們看main函數怎么進行使用: ![](https://img.kancloud.cn/b5/cb/b5cb9d7d3570ccafc245122c68e07e47_762x588.png =600x) ### 數據的處理是在zb\_msg中的handle函數,我們的用戶邏輯和業務代碼就在該函數中去處理即可。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看