由于LW同志的白眼所以今晚決定搞一下基于RS485的modbus RTU 模式代碼移植。
不同的是LW同志是自己實現,而我是使用現成的Modbus協議棧!
1、Modbus協議棧移植,
協議棧移植代碼不算復雜,用了2個小時完成移植 for arm 上運行。移植完畢編譯成功
注意端口內的操作函數,注釋掉,然后在填充硬件相關部分

2、Modbus接收層
機理其實就是一個串口中斷,然后每接收一個字符都會啟動一個定時器計時并且存入BUFF中,同時刷新定時器值,這樣如果有字符接收那么定時器就不斷的刷新而不會溢出,當一幀接收完畢后定時器由于得不到刷新而溢出,這就會導致定時器的溢出。定時器一旦溢出就會觸發一次事件,通知應用層,我收到了一幀報文你可以來取走了。空口無平,要LW同志死心要上代碼的,come on !

以上為串口接收到一個字節中斷后調用,是一個指針函數,在協議棧初始化的時候他被定義為

也就是說我們只要找到 這個函數即可找到串口的底層接收代碼,OK繼續

很不幸我們找到了,并且看到他從硬件中讀了一字節 繼續
看他如何處理

哈哈到此已經可以看到了首先他狀態為 ,所以先接受存進buff,然后開啟定時器
接著如果再有數據中斷就會這樣

可見是一樣的,和上面,那么有字節就會一直這樣循環,當然不能大于
最后就是什么時候幀結束了呢?
首先幀結束了會停止中斷,然后定時器就得不到刷新,然后定時器就會中斷,然后,,,繼續

不好意思又是一個函數指針,他也是初始化定義了如下

繼續

很明顯到這里已經完成了底層的幀截獲,他上報給了應用層
也就是說他是利用字節超時作為幀結束的標志。這就RTU模式底層串口的接收處理。僅此而已。并不高深。
3、應用層
底層把數據投遞后,應用層通過

函數進行輪訓是否收到一幀數據
然后繼續

比較孰了吧,這是判斷是不是給我們的,或者是不是廣播地址,因為廣播首地址我們從機也是要接受滴!然后繼續告訴上層進入

此處完了之后之各種的讀寫

然后就是用戶針對這些填充的函數實體即可!!!OK
以上是理論分析,實際代碼測試不日擇機進行!!
有是LW同志!能不能老實點啊
比特電子
老王
|