[经验分享] GD32F350体验之九(freemodbus的使用)

RCSN   2018-9-30 20:14 楼主
在前面已经说明了freemodbus在GD32的另类移植办法。接下来就是说明如何利用freemodbus这个抽象化的协议栈上,更快速地开发自己的通信应用部分。
Freemodbus在获取到一帧数据之后,如果功能码对应的上,则通过查表跳转到相对应的执行函数当中,比如写多个保持寄存器的功能码为0x16,则跳转到eMBFuncWriteMultipleHoldingRegister函数,
1.png
file:///C:/Users/RCSN/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg
这个写多个保持寄存器的函数接口就是抽象在freemodbus里面的,最终实现回调的还是就是寄存器的数据,寄存器地址,长度,还有读写模型。这个接口是针对对保持寄存器进行所有操作的通用接口。同样,线圈的也有相对应的通用接口,这里我使用的都是对保持寄存器的操作,故以此作为分析点。
2.png
file:///C:/Users/RCSN/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg
既然freemodbus提供这个回调接口,那么我们就可以实现自己的应用部分,比如上位机下发时间设置参数,利用这个参数来修改RTC时间,或者上位机请求一次GD32的RTC系统时间,那么我们就返回参数。
3.png
file:///C:/Users/RCSN/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg
图中的rtc_Time_Data_t全局结构体如下:
4.png
file:///C:/Users/RCSN/AppData/Local/Temp/msohtmlclip1/01/clip_image007.png
RtcSetup()函数接口是指RTC时间设置。内部代码如下:
file:///C:/Users/RCSN/AppData/Local/Temp/msohtmlclip1/01/clip_image009.jpg
6.png 本帖最后由 RCSN 于 2018-9-30 20:17 编辑
1084534438 欢迎交流  [加油,一切皆有可能]

回复评论 (4)

那么接下来我们来套鼓下上位机,楼主使用的是QT,当然上位机源码上,并没有使用类似的协议栈,协议的解析都是自定解析,数据的收发同样也没有用队列。当然并不影响使用。
我们用UI添加两个控件,一个是设置系统时间,一个是获取系统时间。
1.png

设置系统时间控件的处理接口如下,时间使用QT的QDateTime类,并将其转换为我们需要的时间结构体。按照modbus协议发送。
3.png
而usMBWriteHolding接口代码如下:
4.png
相对应的获取时间控件代码类似。按照modbus的协议进行发送
5.png

6.png


1084534438 欢迎交流  [加油,一切皆有可能]
点赞  2018-9-30 21:29
那么有个问题,下位机上发的各类参数,上位机如何解析呢。通常来说,使用队列+超时检测是比较安全的解析,这样异步处理使得数据不会丢失。楼主在此为了方便,直接就是400ms超时检测串口的数据,然后在超时检测函数里面直接buf解析。 7.png
效果图如下:
9.gif
1084534438 欢迎交流  [加油,一切皆有可能]
点赞  2018-9-30 21:39
1084534438 欢迎交流  [加油,一切皆有可能]
点赞  2021-7-26 09:39
mark一下
点赞  2022-2-24 09:02
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复