FreeModbus串行传输初始化
生活随笔
收集整理的這篇文章主要介紹了
FreeModbus串行传输初始化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
先看一下初始化函數,參數包括傳輸模式、從機地址、端口號、波特率和奇偶校驗。從函數大概能夠猜到,初始化內容:選擇傳輸模式,設置從機地址,配置串口。
/* 初始化Modbus協議棧 */ eMBErrorCode eMBInit(eMBMode eMode, UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity);?
先了解一下modbus的地址規則
所以,從機地址必須在1~247之間
?
在485總線上使用Modbus協議,有兩種主要方式:RTU ASCII。在使用過程中,只能選擇其中一種傳輸模式。
?
Modbus RTU初始化,大概內容包括:串口初始化、超時定時器初始化
/* modbus rtu初始化 */ eMBErrorCode eMBRTUInit(UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity) {eMBErrorCode eStatus = MB_ENOERR;ULONG usTimerT35_50us;(void)ucSlaveAddress;ENTER_CRITICAL_SECTION();/* 串口初始化,失敗 */if(xMBPortSerialInit(ucPort, ulBaudRate, 8, eParity) != TRUE){/* 端口層錯誤 */eStatus = MB_EPORTERR;}/* 初始化成功 */else{/* 波特率大于19200 */if(ulBaudRate > 19200){/* 超時時間為35*50=1050us */usTimerT35_50us = 35;}/* 波特率小于等于19200 */else{/* 3.5幀為超時時間 */usTimerT35_50us = (7UL * 220000UL) / (2UL * ulBaudRate);}/* 超時定時器初始化 */if(xMBPortTimersInit((USHORT)usTimerT35_50us) != TRUE){/* 端口層錯誤 */eStatus = MB_EPORTERR;}}EXIT_CRITICAL_SECTION();return eStatus; }特別要注意的是,串口數據位固定為8位,超時時間固定為3.5幀。這兩個參數是modbus規定死的。
?
Modbus ASCII初始化,大概內容包括:串口初始化、超時定時器初始化
/* modbus ascii初始化 */ eMBErrorCode eMBASCIIInit(UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity) {eMBErrorCode eStatus = MB_ENOERR;(void)ucSlaveAddress;ENTER_CRITICAL_SECTION();ucMBLFCharacter = MB_ASCII_DEFAULT_LF;/* 串口初始化,失敗 */if(xMBPortSerialInit(ucPort, ulBaudRate, 7, eParity) != TRUE){/* 端口層錯誤 */eStatus = MB_EPORTERR;}/* 超時定時器初始化,超時時間1秒 */else if(xMBPortTimersInit(MB_ASCII_TIMEOUT_SEC * 20000UL) != TRUE){/* 端口層錯誤 */eStatus = MB_EPORTERR;}EXIT_CRITICAL_SECTION();return eStatus; }特別要注意的是,串口數據位固定為7位,超時時間固定為1秒。這兩個參數是modbus規定死的。
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的FreeModbus串行传输初始化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字逻辑概论
- 下一篇: 跟2G说再见?这些IoT“钉子户”表示做