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.编写如下的串口处理代码
代码完整的如下:
复制代码 这里需要注意的是串口用的端口是定死的,
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 )
复制代码
|