找回密码
 立即注册
查看: 1468|回复: 31

ModBus_RTU(4组串口任选+DMA传输的主从机)的lib库使用,STC32实现

[复制链接]
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 88 天

    [LV.6]常住居民II

    38

    主题

    982

    回帖

    6755

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6755
    QQ
    发表于 2023-12-27 11:14:32 | 显示全部楼层 |阅读模式
    ModBus_RTU(4组串口任选+DMA传输的/机)的lib库使用,STC32位8051实现
    一、准备好自己的代码工程
    这里以STC32位8051的点灯工程为例

    截图202312270915234058.jpg

    编写该代码,可以看到这个0错误,下载进去之后可以看到屠龙刀板子上的P2端口的8个LED开始闪烁,表示这个代码工程无问题


    二、添加库文件到自己的工程里里
    1.添加附件代码包到工程里

    截图202312270919222539.jpg

    2.然后按照如下方法调用一下头文件的路径
    截图202312270920532837.jpg


    3.将库文件添加到工程列表
    截图202312270923176294.jpg


    4.修改配置文件
    4.1头文件
    截图202312270926315517.jpg

    确认自己工程里的stc32的头文件是否是这个,不是的话修改位自己的头文件

    4.2系统时钟
    截图202312270927324764.jpg

    因为用到了串口,在115200的波特率下,我一般用这个系统时钟,后面所有要使用系统时钟的地方均需要调用config.h,调用这个MAIN_Fosc的宏来获取系统时钟,
    截图202312270928462440.jpg

    由于原来的工程里也有,且宏定义名称都一样,所以只需要把这个宏删掉,然后修改调用的头文件为config.h即可

    4.3宏定义
    截图202312270930186994.jpg

    如果自己的工程里也有这部分的宏定义,可以屏蔽自己的,统一调用这个config.h来获取数据。


    5按照如上的代码改完,工程应该可以编译通过了
    截图202312270933249703.jpg

    可以看到工程已经0错误,0警告了

    三、开始测试串口收发的代码
    1添加系统时钟计时变量
    截图202312270939033488.jpg

    主函数添加这一变量,用来记录系统运行的上一次的时刻

    2.添加头文件到代码里
    截图202312270948478534.jpg

    这个是串口和485口的配置头文件,配合lib文件一起使用的

    3选择串口的参数
    截图202312270953535670.jpg

    截图202312270954251200.jpg

    截图202312271004568519.jpg

    记得最后在工程里添加串口初始化的函数哦!!

    4.编写如下的串口处理代码
    截图202312271029373160.jpg


    代码完整的如下:
    1. <blockquote>    while(1)
    复制代码
    这里需要注意的是串口用的端口是定死的,
    4路串口的引脚分别是
    串口1  --- P16/P17
    串口2  --- P46/P47

    串口3  --- P50/P51

    串口4  --- P52/P53


    再来看下这个代码的含义:
    Usart_RecCheck是数据接收检查的函数
    第一个入口参数是串口结构体的指针,串口1-4分别对应g_tUart1-g_tUart4,这个函数对四个串口均有效
    第二个入口参数是运行时间,因为要用超时处理,这里需要提供时间间隔,所以本次时刻减去上一次的时刻就是时间间隔

    函数返回值是当前状态  0:未接收到数据   1:接收中   2:接收完成(超过一定的时间没有收到表示接受完成)

    Usart_Send是数据发送的函数

    第一个入口参数是串口结构体的指针,串口1-4分别对应g_tUart1-g_tUart4,这个函数对四个串口均有效

    第二个入口参数是要发送的数据
    第三个入口参数是要发送的数据长度


    Usart_RecSet是数据接收初始化的函数(用的DMA接收数据,没有超出缓冲区就不会触发DMA接收完成中断,这里用的软件超时中断来判断接收完成,用STC32G8K64可以用串口超时寄存器)


    第一个入口参数是串口结构体的指针,串口1-4分别对应g_tUart1-g_tUart4,这个函数对四个串口均有效

    第二个入口参数是超时时间,超过一定时间没有接收到数据表示错误,Usart_RecCheck会返回0xff


    因为接受到的数据会保存到g_tUart1.g_RxBuf这个数组里,所以直接调用这个数组返回即可, 这里检测的是g_tUart1,也就是串口1

    编写完成之后开始编译:
    截图202312271030026783.jpg

    这里编译完0错误,再来下载,记得要改下图的参数,
    截图202312271030309506.jpg 截图202312271030439596.jpg

    下载完按照如下接线:
    截图202312271032065688.jpg

    然后就可以开始测试了:
    截图202312271032383806.jpg

    可以看到这里发送什么,就会回复什么!说明串口的代码可以正常使用了;

    四、开始测试MODBUS RTU主机的代码:

    直接编写如下代码:
    1. <blockquote><span style="white-space:pre">                </span>if( Time_Run_Last!=Time_Run )
    复制代码
    来简单的解析一下:
    MODH_Poll是modbus rtu主机运行函数,放在主循环调用就好了。第一个参数是通道号(要几路主机都可以自己在MODBUS_NUM的宏定义)  第二个参数是挂载的串口  第三个就是时间间隔
    ModHostMode_SendDeal是数据发送函数,第一个参数是通道号  第二个参数是从机地址 第3个参数是功能码(当前功能码03.06可用,其余的下一版添加)   第4个参数是地址数据个数   第5个参数是数据


    所以这个代码就是按下P32按钮读取数据,P33按钮按下写入数据,每次递增!下载进去试一下
    截图202312271101192804.jpg

    红框圈起来的事P32按下的通信时间,没圈起来的是P33的事件,因为之前按过了几下,这里数据不是从0开始,但是可以看到这里读写功能都是正常了的!


    五、开始测试MODBUS RTU从机的代码:



    1. <blockquote><span style="white-space:pre">                </span>if( Time_Run_Last!=Time_Run )
    复制代码
    截图202312271109359581.jpg
    截图202312271110223704.jpg
    截图202312271110577250.jpg
    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:27
  • 签到天数: 119 天

    [LV.6]常住居民II

    12

    主题

    315

    回帖

    862

    积分

    高级会员

    积分
    862
    发表于 2023-12-27 11:22:01 | 显示全部楼层
    谢谢版主,学习到了。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 88 天

    [LV.6]常住居民II

    38

    主题

    982

    回帖

    6755

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6755
    QQ
     楼主| 发表于 2023-12-27 11:24:13 | 显示全部楼层
    需要怎么优化升级的,或有什么问题的欢迎留言!
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:12
  • 签到天数: 123 天

    [LV.7]常住居民III

    3

    主题

    87

    回帖

    377

    积分

    中级会员

    积分
    377
    发表于 2023-12-27 11:34:57 | 显示全部楼层
    感谢冲哥的例程,改天试验一下
    You can you up!~No can no BB!~
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-12-29 10:39
  • 签到天数: 2 天

    [LV.1]初来乍到

    1

    主题

    2

    回帖

    15

    积分

    新手上路

    积分
    15
    发表于 2023-12-28 10:21:58 | 显示全部楼层
    Modbus库哪里下载
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 06:15
  • 签到天数: 151 天

    [LV.7]常住居民III

    25

    主题

    697

    回帖

    1729

    积分

    金牌会员

    积分
    1729
    发表于 2023-12-28 15:11:12 | 显示全部楼层
    同问,请问这个库在哪里下载?
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 88 天

    [LV.6]常住居民II

    38

    主题

    982

    回帖

    6755

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6755
    QQ
     楼主| 发表于 2023-12-28 21:39:31 | 显示全部楼层
    初版在附件下载,论坛可能不一定会及时更新,最新的代码到时候可以关注下群文件!后面争取把所有复杂的协议全都优化成上手即用的lib库!

    MOD测试文件.rar

    114.91 KB, 下载次数: 135

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 06:15
  • 签到天数: 151 天

    [LV.7]常住居民III

    25

    主题

    697

    回帖

    1729

    积分

    金牌会员

    积分
    1729
    发表于 2023-12-29 09:12:26 | 显示全部楼层
    电子DIY小家 发表于 2023-12-28 21:39
    初版在附件下载,论坛可能不一定会及时更新,最新的代码到时候可以关注下群文件!后面争取把所有复杂的协议 ...

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    前天 08:47
  • 签到天数: 131 天

    [LV.7]常住居民III

    20

    主题

    1033

    回帖

    2435

    积分

    金牌会员

    积分
    2435
    发表于 2023-12-29 09:14:07 | 显示全部楼层
    电子DIY小家 发表于 2023-12-28 21:39
    初版在附件下载,论坛可能不一定会及时更新,最新的代码到时候可以关注下群文件!后面争取把所有复杂的协议 ...

    同时也请把源码发上来就行
    参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
    技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2023-12-11 09:46
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    0

    主题

    8

    回帖

    62

    积分

    注册会员

    积分
    62
    发表于 2024-1-2 20:42:51 | 显示全部楼层
    感谢楼主,但是好像看不到那几个代码部分
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-4-28 04:33 , Processed in 0.077833 second(s), 69 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表