給大家分享一個網(wǎng)友qq_34471646做的實驗,用STM32做從機(jī)接收主機(jī)發(fā)送過來的數(shù)據(jù)包(也是基于modbus協(xié)議),而后從機(jī)將一些數(shù)據(jù)發(fā)送給主機(jī)。
首先呢還是介紹下modbus協(xié)議。其實modbus協(xié)議你不需要了解太多。既然是要使用,那么你只需要明白一點,modbus協(xié)議就是在你要發(fā)送的數(shù)據(jù)的基礎(chǔ)上,在數(shù)據(jù)前面加上一個幀頭,數(shù)據(jù)后面加一個幀尾。嗯,是不是還是有點迷?舉個例子吧。
將寄存器108的內(nèi)容表示為兩個十六進(jìn)制字節(jié)值02 2B,或十進(jìn)制555. 將寄存器109--110的內(nèi)容分別表示為十六進(jìn)制的00 00和 00 64;或十進(jìn)制的0 和100.
所以主機(jī)會發(fā)過來一幀數(shù)據(jù):01 03 00 6B 00 03 17 74(這個01是我假設(shè)主機(jī)的地址,這個域名的作用就是用來判斷是否是主機(jī)發(fā)送過來的數(shù)據(jù)。因為通信過程可能因為各種原因而導(dǎo)致主機(jī)發(fā)送過來的數(shù)據(jù)異常,故而我們從機(jī)接收到數(shù)據(jù)之后會先對數(shù)據(jù)進(jìn)行分析主機(jī)發(fā)過來的數(shù)據(jù)是否正常,正常從機(jī)再發(fā)送數(shù)據(jù)過去,異常則不對這幀數(shù)據(jù)進(jìn)行響應(yīng)即從機(jī)不發(fā)數(shù)據(jù)。17 74是根據(jù)01 03 00 6B 00 03計算出來的CRC校驗值。)
當(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è)的這個從機(jī)的地址,需注意的是咱們假設(shè)自己的從機(jī)地址不要與主機(jī)的地址相同。)在這幀數(shù)據(jù)中幀頭就是02 03 06,11 8A是根據(jù)02 03 06 02 2B 00 00 00 64計算出來的CRC 校驗值也是幀尾。
那么問題來了。。。程序中我們怎么去計算CRC校驗值呢???這個嘛 ,下方我會貼上整個實驗的例程,其中CRC.c中h函數(shù)unsigned int GetCRC16(unsigned char *ptr, unsigned char len)我們只需要調(diào)用這個函數(shù)就可以算出CRC校驗值了。有興趣的也可以去額外了解下CRC校驗具體是怎么實現(xiàn)的。
整個實驗例程如下:
main.c:
CRC16.c:
-
MODBUS
+關(guān)注
關(guān)注
28文章
1995瀏覽量
78938 -
STM32
+關(guān)注
關(guān)注
2289文章
11011瀏覽量
362268 -
ModBus協(xié)議
+關(guān)注
關(guān)注
3文章
182瀏覽量
34098 -
STM32F103
+關(guān)注
關(guān)注
33文章
481瀏覽量
65029
發(fā)布評論請先 登錄
STM32F103x8 STM32F103xB單片機(jī)數(shù)據(jù)手冊
為UART、MCXA142實現(xiàn)ISP通信的主機(jī)端,發(fā)送Ping數(shù)據(jù)包并收到預(yù)期的響應(yīng),發(fā)送和接收數(shù)據(jù)包的典型順序是什么?
STM32F103×8/STM32F103×B MCU手冊
STM32F103做從站 上電過程,上位機(jī)不斷發(fā)送數(shù)據(jù)造成,通訊失敗怎么解決?
零死角玩轉(zhuǎn)STM32F103—指南者
stm32f103用SPI驅(qū)動ADS8341數(shù)據(jù)不正確,忽大忽小的原因?
用tvl320aic32完成通話的功能,單片機(jī)i2s接口發(fā)送的數(shù)據(jù)aic32接收不到怎么解決?
天拓四方:Modbus協(xié)議網(wǎng)關(guān)工作原理及功能解析
一文淺談Modbus協(xié)議
Modbus協(xié)議網(wǎng)關(guān)簡介

esp8266怎么做才能每秒發(fā)送更多的數(shù)據(jù)包呢?
如何直接從phy mac層發(fā)送和接收802.11數(shù)據(jù)包?
請問如何使用AT CIPSEND或AT CIPSENDBUF發(fā)送多個數(shù)據(jù)包?
Modbus協(xié)議轉(zhuǎn)Profibus協(xié)議網(wǎng)關(guān)接溫控表與PLC通訊

評論