新聞中心

        EEPW首頁 > 手機與無線通信 > 設計應用 > RS-485的多機通信方案探究

        RS-485的多機通信方案探究

        作者: 時間:2012-12-24 來源:網絡 收藏

        3 軟件協議
        3.1 協議格式
        Modbus協議按功能可以劃分為:地址碼、功能碼、數據碼、CRC校驗碼。而在RTU方式下,采用CRC循環冗余校驗,具體格式如圖3所示。

        本文引用地址:http://www.104case.com/article/153643.htm

        c.JPG


        Modbus協議長度根據用戶需求自己設定,地址碼標識終端地址,即和網關節點的從機地址。功能碼則是主機告訴從機要執行什么功能。數據碼長度由用戶自己確定,最后根據前3個功能字段,生成兩個字節的CRC校驗碼,用來驗證前面的字段是否存在傳輸錯誤。
        3.2 CRC生成算法
        CRC算法分為靜態和動態兩種,靜態的適合片內RAM非常有限的MCU,而動態的適合RAM空間相對比較寬裕的MCU。CRC校驗碼生成步驟如下:
        ①初始化寄存器內容為0xffff。
        ②提取第一個字節數據和寄存器內容相異或。
        ③檢測最低有效位(LSB),如果LSB為1,寄存器單獨和預置值異或;如果LSB為0,則不進行任何操作,然后將結果向LSB方向移動,最高有效位以0填充。
        ④重復第③步8次,直到最后一位(第8位)完成。
        ⑤提取下一個8位字節,重復步驟③、④的操作,等待所有字段都執行完,最終寄存器中的值就是所求的CRC校驗碼。
        上述步驟中,如果預置值在整個過程中不變,則為靜態的CRC校驗;在動態的CRC校驗中,存在一個動態表,預置值每次都根據動態表變化,所以準確性更高,而動態表要開辟一個較大的空間來存儲。所以,根據MCU的RAM大小決定使用動態校驗還是靜態校驗。算法結束后,寄存器中存人的就是前N個字節的CRC校驗碼,運用該算法,不需要事先知道協議的整體長度,最后都同樣生成兩個字節長度的校驗碼,故可移植性好、通用性強。
        3.3 自動地址識別模式
        自動地址識別模式是經典模式,通過設置Cortex-M054的狀態寄存器,可使UART工作在此模式下。節點在接收到地址字節時,判斷地址字節數據是否與UA_ALT_CSR[ADDR_MATCH]值相匹配,如果匹配,表示網關節點要與此終端,故接收下面網關節點發送的所有數據字節。同時,地址字節和數據字節都會被存入UART的FIFO中,否則忽略所有字節,既不產生中斷,也不存入FIFO,直到匹配。
        串口通信中由起始位、數據位、奇偶校驗位、停止位4部分組成。當奇偶校驗位為0時,表示傳輸的是數據字節;當它為1時,表示傳輸的是地址字節。Cortex—M054的UA_ALT_CSR是一個32位的寄存器,其ADDR_MATCH用8位來表示,故自動地址識別模式最大從機數只支持256個節點。它的優點是:由于所有從機掛載在一根總線上,故網關節點發送數據時,只有地址與自己匹配的節點才會響應,其他節點可以正常執行自己原先的任務而不被打擾,系統整體效率高。缺點是從機只能被主機輪詢時才能發送信息,不能主動和主機通信;一個總線上只能掛載256個節點。
        3.4 普通模式通信
        普通模式可以配置為接收所有數據,也可以選擇性地忽略數據,直到接收到地址字節。為了更加靈活地利用協議通信,將其設置為接收所有數據,即只要網關節點向總線發送數據,那么總線上的所有節點都會收到數據,再根據協議解析內容執行相應的動作,接地流程圖如圖4所示。

        d.JPG


        Cortex—M054內部有4 KB的Data Flash給用戶存儲數據,故將節點的地址存入Flash中。當系統上電復位后,先從Flash中讀出節點的地址,存入全局變量address中。當收到數據包之后,進行CRC校驗,如果正確就接收,再根據協議解析地址地段,其值與address比較,以此判定此包是否屬于自己。
        自動地址識別模式是由芯片自動篩選地址,而此處需要軟件判斷。因此,地址長度可以由用戶自己設定。

        數字通信相關文章:數字通信原理


        通信相關文章:通信原理




        關鍵詞: 探究 方案 通信 RS-485

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 常熟市| 彰武县| 望江县| 衡山县| 临江市| 攀枝花市| 穆棱市| 马公市| 岢岚县| 乌拉特前旗| 清远市| 溧阳市| 永嘉县| 辽宁省| 湛江市| 重庆市| 辽阳县| 固原市| 宜阳县| 香格里拉县| 白玉县| 南皮县| 祁阳县| 麻阳| 沈阳市| 石门县| 巴林左旗| 中方县| 陇西县| 崇义县| 河间市| 化隆| 鞍山市| 万荣县| 泗洪县| 辽阳市| 英吉沙县| 皋兰县| 綦江县| 临颍县| 芮城县|