給大家分享一個(gè)網(wǎng)友qq_34471646做的實(shí)驗(yàn),用STM32做從機(jī)接收主機(jī)發(fā)送過(guò)來(lái)的數(shù)據(jù)包(也是基于modbus協(xié)議),而后從機(jī)將一些數(shù)據(jù)發(fā)送給主機(jī)。
首先呢還是介紹下modbus協(xié)議。其實(shí)modbus協(xié)議你不需要了解太多。既然是要使用,那么你只需要明白一點(diǎn),modbus協(xié)議就是在你要發(fā)送的數(shù)據(jù)的基礎(chǔ)上,在數(shù)據(jù)前面加上一個(gè)幀頭,數(shù)據(jù)后面加一個(gè)幀尾。嗯,是不是還是有點(diǎn)迷?舉個(gè)例子吧。

將寄存器108的內(nèi)容表示為兩個(gè)十六進(jìn)制字節(jié)值02 2B,或十進(jìn)制555. 將寄存器109--110的內(nèi)容分別表示為十六進(jìn)制的00 00和 00 64;或十進(jìn)制的0 和100.
所以主機(jī)會(huì)發(fā)過(guò)來(lái)一幀數(shù)據(jù):01 03 00 6B 00 03 17 74(這個(gè)01是我假設(shè)主機(jī)的地址,這個(gè)域名的作用就是用來(lái)判斷是否是主機(jī)發(fā)送過(guò)來(lái)的數(shù)據(jù)。因?yàn)?a href="http://www.brongaenegriffin.com/v/tag/1301/" target="_blank">通信過(guò)程可能因?yàn)楦鞣N原因而導(dǎo)致主機(jī)發(fā)送過(guò)來(lái)的數(shù)據(jù)異常,故而我們從機(jī)接收到數(shù)據(jù)之后會(huì)先對(duì)數(shù)據(jù)進(jìn)行分析主機(jī)發(fā)過(guò)來(lái)的數(shù)據(jù)是否正常,正常從機(jī)再發(fā)送數(shù)據(jù)過(guò)去,異常則不對(duì)這幀數(shù)據(jù)進(jìn)行響應(yīng)即從機(jī)不發(fā)數(shù)據(jù)。17 74是根據(jù)01 03 00 6B 00 03計(jì)算出來(lái)的CRC校驗(yàn)值。)
當(dāng)從機(jī)接收到這串?dāng)?shù)據(jù),并且判斷數(shù)據(jù)正常則發(fā)送一幀數(shù)據(jù)到主機(jī):02 03 06 02 2B 00 00 00 64 11 8A(同樣的02是我假設(shè)的這個(gè)從機(jī)的地址,需注意的是咱們假設(shè)自己的從機(jī)地址不要與主機(jī)的地址相同。)在這幀數(shù)據(jù)中幀頭就是02 03 06,11 8A是根據(jù)02 03 06 02 2B 00 00 00 64計(jì)算出來(lái)的CRC 校驗(yàn)值也是幀尾。

那么問(wèn)題來(lái)了。。。程序中我們?cè)趺慈ビ?jì)算CRC校驗(yàn)值呢???這個(gè)嘛 ,下方我會(huì)貼上整個(gè)實(shí)驗(yàn)的例程,其中CRC.c中h函數(shù)unsigned int GetCRC16(unsigned char *ptr, unsigned char len)我們只需要調(diào)用這個(gè)函數(shù)就可以算出CRC校驗(yàn)值了。有興趣的也可以去額外了解下CRC校驗(yàn)具體是怎么實(shí)現(xiàn)的。
整個(gè)實(shí)驗(yàn)例程如下:
main.c:
CRC16.c:
-
MODBUS
+關(guān)注
關(guān)注
28文章
2388瀏覽量
82305 -
STM32
+關(guān)注
關(guān)注
2305文章
11123瀏覽量
371230 -
ModBus協(xié)議
+關(guān)注
關(guān)注
3文章
189瀏覽量
35042 -
STM32F103
+關(guān)注
關(guān)注
34文章
490瀏覽量
67114
發(fā)布評(píng)論請(qǐng)先 登錄
Modbus協(xié)議的深度剖析
Modbus協(xié)議轉(zhuǎn)HTTP協(xié)議,實(shí)現(xiàn)JSON格式對(duì)接MES等系統(tǒng)平臺(tái)
SPI主機(jī)/從機(jī)接收發(fā)送都開啟DMA通信
STM32F103長(zhǎng)時(shí)間運(yùn)行,串口發(fā)送失敗怎么解決?
在STM32F103c8上做DLQR最優(yōu)控制算法的C編程資料
Modbus協(xié)議轉(zhuǎn)換:讓工業(yè)設(shè)備輕松“對(duì)話”

基于MODBUS協(xié)議用STM32F103做從機(jī)接收發(fā)送數(shù)據(jù)包實(shí)驗(yàn)
評(píng)論