找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5002|回復(fù): 0
收起左側(cè)

基于RS485 的Modbus RTU 接收機制

[復(fù)制鏈接]
ID:82781 發(fā)表于 2015-6-13 00:57 | 顯示全部樓層 |閱讀模式


由于LW同志的白眼所以今晚決定搞一下基于RS485的modbus RTU 模式代碼移植。

不同的是LW同志是自己實現(xiàn),而我是使用現(xiàn)成的Modbus協(xié)議棧!

1、Modbus協(xié)議棧移植,
協(xié)議棧移植代碼不算復(fù)雜,用了2個小時完成移植 for arm 上運行。移植完畢編譯成功
注意端口內(nèi)的操作函數(shù),注釋掉,然后在填充硬件相關(guān)部分

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

以上為串口接收到一個字節(jié)中斷后調(diào)用,是一個指針函數(shù),在協(xié)議棧初始化的時候他被定義為

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

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

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

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

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

繼續(xù)

很明顯到這里已經(jīng)完成了底層的幀截獲,他上報給了應(yīng)用層

也就是說他是利用字節(jié)超時作為幀結(jié)束的標(biāo)志。這就RTU模式底層串口的接收處理。僅此而已。并不高深。

3、應(yīng)用層
底層把數(shù)據(jù)投遞后,應(yīng)用層通過

函數(shù)進行輪訓(xùn)是否收到一幀數(shù)據(jù)
然后繼續(xù)


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

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

然后就是用戶針對這些填充的函數(shù)實體即可。!OK


以上是理論分析,實際代碼測試不日擇機進行!


有是LW同志!能不能老實點啊

比特電子
老王



回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表