找回密码
 注册
关于网站域名变更的通知
查看: 170|回复: 0
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
 楼主| 发表于 2025-11-17 17:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 岁月如歌21 于 2025-11-17 17:23 编辑
1 V7 c/ q; F0 W: T/ Q# V
/ c: B! L& B* ?0 X" ]ModBus_RTU(4组串口任选+DMA传输的/机)的lib库使用,STC32位8051实现
5 l$ P' \( y1 G一、准备好自己的代码工程2 n+ y( I) p: F
这里以STC32位8051的点灯工程为例
9 J6 ?& X: [5 u$ ?

3 W/ q+ u! x3 N2 Q8 h! |3 m编写该代码,可以看到这个0错误,下载进去之后可以看到屠龙刀板子上的P2端口的8个LED开始闪烁,表示这个代码工程无问题* @8 t- D  V: A7 C, i
8 l5 z. s0 f0 Y2 h' f! n+ E) ~

: c; e, c6 @; h: b二、添加库文件到自己的工程里里2 o7 v% G  t, c, |: ~
1.添加附件代码包到工程里
! U' ?  n" _- z2 ?& D
& \. E* E: q0 Y4 M
2.然后按照如下方法调用一下头文件的路径
1 t; G" h% S: l+ ^( {1 v9 w

- [* H4 M7 X8 e0 O" R$ |! T: T/ L# m3.将库文件添加到工程列表! M- ?# M) f* @

3 V% s% d- X1 S- N2 e7 \7 C4.修改配置文件
& L2 @0 [, l& a/ n4 I3 G8 @3 _5 f4.1头文件
$ ~/ m' H8 h  w6 N3 o6 i

4 g  b% E( z, Q2 j1 q2 G因为用到了串口,在115200的波特率下,我一般用这个系统时钟,后面所有要使用系统时钟的地方均需要调用config.h,调用这个MAIN_Fosc的宏来获取系统时钟,8 ]( }! Y, Z# F7 R+ s' X) U
& G3 v, Y# G. f9 |; x" M- S
由于原来的工程里也有,且宏定义名称都一样,所以只需要把这个宏删掉,然后修改调用的头文件为config.h即可
) {8 M. `! v- O$ w: `4 ]+ B9 B) @! U7 f) I3 n1 c
4.3宏定义
3 `/ W# O9 U& h$ O* n& V4 I
5 U3 V( S& w8 a# ?7 w' U8 y" F
如果自己的工程里也有这部分的宏定义,可以屏蔽自己的,统一调用这个config.h来获取数据。" t, W6 i) |* v

0 U4 u% i1 i$ O9 \6 ^/ l3 w2 v0 o( ?& g0 d: p
5按照如上的代码改完,工程应该可以编译通过了! i4 \, C; x4 l* \5 y
) o7 L6 Q! G$ u% C  Q# i
可以看到工程已经0错误,0警告了5 S7 R/ v9 |* {' I
* p# \5 B: Y( R5 u( s
三、开始测试串口收发的代码
+ W& c: T- d3 P' V; Z4 G: y/ q; F* Q1添加系统时钟计时变量2 X+ Y' z5 t  B
" \3 W9 S2 W9 C" C
主函数添加这一变量,用来记录系统运行的上一次的时刻
% d" ?  C% ^3 \  M2 t2 ~& ?7 W- |9 B' u
2.添加头文件到代码里* [1 s  k/ X( Z" `( t0 r6 y

3 V  R4 H" h1 Z$ s这个是串口和485口的配置头文件,配合lib文件一起使用的7 x! O  u) r8 c% j( o) k

1 J# x( u& j) o5 H/ t; `3选择串口的参数4 [2 ^: z( t2 z  m
+ K( u) r3 D; L/ Q7 S
; Z: |2 F5 c! _
; ~  i$ d% O) ]' N3 ^" p
记得最后在工程里添加串口初始化的函数哦!!) Q% s+ ?% N) @- D% ^4 v
4 N& i0 B6 |, l- r/ y: s. Q- U' J- T
4.编写如下的串口处理代码
+ ], E& L( w/ X" L2 V

8 a4 m* o/ v7 f9 F; t再来看下这个代码的含义:
1 D1 P1 |/ [* i5 u9 {" \; eUsart_RecCheck是数据接收检查的函数$ t% ?, x$ l# E
第一个入口参数是串口结构体的指针,串口1-4分别对应g_tUart1-g_tUart4,这个函数对四个串口均有效
# g' H. V3 s5 Y) i9 x6 H4 _+ k第二个入口参数是运行时间,因为要用超时处理,这里需要提供时间间隔,所以本次时刻减去上一次的时刻就是时间间隔6 |; t" K; u5 x9 Z' z9 J
; x& J: b1 j0 P8 t
函数返回值是当前状态  0:未接收到数据   1:接收中   2:接收完成(超过一定的时间没有收到表示接受完成)
5 U/ z7 @9 y8 ^$ s* Y1 t* y6 h# ~6 X0 O- {6 J- _; q
Usart_Send是数据发送的函数
' E& M0 l8 y" J+ Y+ j; i) F, E+ G$ i
6 V) k$ I8 J) F, N& z+ Q: C: |8 d1 u第一个入口参数是串口结构体的指针,串口1-4分别对应g_tUart1-g_tUart4,这个函数对四个串口均有效, @3 j2 c/ x4 M$ G; F
" C( A6 a4 C) k5 x6 j4 U
第二个入口参数是要发送的数据
. E  x1 [) y7 n: `, c第三个入口参数是要发送的数据长度! i8 h$ B7 R4 t# }

5 S) v4 }3 R# ~3 u& P/ {* w3 \6 H
Usart_RecSet是数据接收初始化的函数(用的DMA接收数据,没有超出缓冲区就不会触发DMA接收完成中断,这里用的软件超时中断来判断接收完成,用STC32G8K64可以用串口超时寄存器)/ M& V: z: H7 T

9 y  P. _. r2 n( F4 C  l" ?# M) l9 K( i& H( R- f3 z7 p% m0 h! y
第一个入口参数是串口结构体的指针,串口1-4分别对应g_tUart1-g_tUart4,这个函数对四个串口均有效) D+ v4 m. N  W- S/ ?% Z3 ]2 l( d

9 g" m- h" Z3 G第二个入口参数是超时时间,超过一定时间没有接收到数据表示错误,Usart_RecCheck会返回0xff) |$ T: O& q! j2 ~
. f- y) y# O  I# d

: u7 m' S9 F, b7 {! W) }2 [因为接受到的数据会保存到g_tUart1.g_RxBuf这个数组里,所以直接调用这个数组返回即可, 这里检测的是g_tUart1,也就是串口1
1 a: H0 ^1 n  b+ b: z1 C0 X
( {7 G' F' H* r, R编写完成之后开始编译:
; R: X. o+ v" r# e. n
! ?) u& N% n* P% A% K& X
这里编译完0错误,再来下载,记得要改下图的参数,+ l0 f: d# X, F+ I( ?3 ~4 J/ N

7 X" V7 e' T! a9 \3 l5 X% A* Y" k* ^+ r" z3 h
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-26 05:12 , Processed in 0.171875 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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