电子DIY小家 发表于 2023-12-27 11:14:32

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

ModBus_RTU(4组串口任选+DMA传输的主/从机)的lib库使用,STC32位8051实现
一、准备好自己的代码工程
这里以STC32位8051的点灯工程为例


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


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



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



3.将库文件添加到工程列表



4.修改配置文件
4.1头文件


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

4.2系统时钟


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


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

4.3宏定义


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


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


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

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


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

2.添加头文件到代码里


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

3选择串口的参数






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

4.编写如下的串口处理代码



代码完整的如下:
<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

编写完成之后开始编译:


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


下载完按照如下接线:


然后就可以开始测试了:


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

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

直接编写如下代码:
<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按钮按下写入数据,每次递增!下载进去试一下


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


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



<blockquote><span style="white-space:pre">                </span>if( Time_Run_Last!=Time_Run )

jwg 发表于 2023-12-27 11:22:01

谢谢版主,学习到了。

电子DIY小家 发表于 2023-12-27 11:24:13

需要怎么优化升级的,或有什么问题的欢迎留言!

西红柿牛柳 发表于 2023-12-27 11:34:57

感谢冲哥的例程,改天试验一下

xh2008email 发表于 2023-12-28 10:21:58

Modbus库哪里下载

jwd 发表于 2023-12-28 15:11:12

同问,请问这个库在哪里下载?

电子DIY小家 发表于 2023-12-28 21:39:31

初版在附件下载,论坛可能不一定会及时更新,最新的代码到时候可以关注下群文件!后面争取把所有复杂的协议全都优化成上手即用的lib库!

jwd 发表于 2023-12-29 09:12:26

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

{:4_250:}

_奶咖君_ 发表于 2023-12-29 09:14:07

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

同时也请把源码发上来就行{:4_200:}

coco 发表于 2024-1-2 20:42:51

感谢楼主{:4_196:},但是好像看不到那几个代码部分
页: [1] 2 3 4
查看完整版本: ModBus_RTU(4组串口任选+DMA传输的主从机)的lib库使用,STC32实现