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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 岁月如歌21 于 2025-11-17 17:23 编辑
6 o) G& @2 K& d' t" a% H
3 V+ L$ H  B: xModBus_RTU(4组串口任选+DMA传输的/机)的lib库使用,STC32位8051实现8 T4 l2 m( }& C" P! b+ F
一、准备好自己的代码工程
; d, I, _7 }3 R+ `) g2 W+ b4 i2 B这里以STC32位8051的点灯工程为例" P6 U3 D- c: Q. d7 @

# m9 c- X; Z# r8 R+ }8 l3 \编写该代码,可以看到这个0错误,下载进去之后可以看到屠龙刀板子上的P2端口的8个LED开始闪烁,表示这个代码工程无问题
- i) B  _! `4 A: j' f6 y; K' ~! L2 N5 Q) C% M" m5 n3 G
2 j0 d, {: |+ E. u# Y
二、添加库文件到自己的工程里里) O2 Y# `% m, C9 d; r
1.添加附件代码包到工程里, L/ t# z, z6 J2 [% E' p  p
0 B: S2 A/ ~9 K0 d9 J- @
2.然后按照如下方法调用一下头文件的路径* D# `* r8 v+ s
) H7 |3 U* k5 z2 N: Z8 p8 D" F& Q! \$ N
3.将库文件添加到工程列表2 V. Z) d) F3 r( w9 A) B! ^
$ D" a, {, ~5 D8 x/ E
4.修改配置文件' e! Z3 w: T. {) E5 w3 L  G" N
4.1头文件
9 c( Z, {$ ~/ r- j

! G: [. m% E! D2 K, a4 C5 N因为用到了串口,在115200的波特率下,我一般用这个系统时钟,后面所有要使用系统时钟的地方均需要调用config.h,调用这个MAIN_Fosc的宏来获取系统时钟,
6 ]0 L- m( F3 A( M$ [4 g% |

& R1 r( S& R9 k# i( G: Z0 Y- z8 O由于原来的工程里也有,且宏定义名称都一样,所以只需要把这个宏删掉,然后修改调用的头文件为config.h即可; X- M4 N# v7 |

! M1 O5 j0 k. K3 L9 c* u5 t4.3宏定义
, n/ h# H5 R8 U7 S2 V2 S, V! z

# @  b2 \6 z3 Q0 D如果自己的工程里也有这部分的宏定义,可以屏蔽自己的,统一调用这个config.h来获取数据。* [; `7 @" [& S. C9 A1 w

6 _2 B( N7 I) Q- z! y/ `
! j2 g3 J: O, z5 M8 t7 W5按照如上的代码改完,工程应该可以编译通过了
; e% h" |& ^3 o! ]/ n
: j: Y; x/ U. f
可以看到工程已经0错误,0警告了" q: d+ @7 V' d" s9 F
* N3 [( C. |% T6 }. V
三、开始测试串口收发的代码9 w. }6 n* i, s' ]" N  n
1添加系统时钟计时变量
! w" U/ r4 Z( c2 U! Q( Q! t
( Q1 z: _& U8 }$ S
主函数添加这一变量,用来记录系统运行的上一次的时刻
. ]4 k3 |: l2 a  d7 g% j& F* A  |
5 h# ?  W. W4 K: n3 U2.添加头文件到代码里' `0 C" i5 ^1 s8 a' ~( l- P  m
9 U: Q2 A$ x8 Y$ a
这个是串口和485口的配置头文件,配合lib文件一起使用的2 w9 `. V0 h5 w# Z

0 b, W% x7 m4 X5 l& w7 u! ]- q3选择串口的参数0 Y/ ?! B& v" e4 a6 e" h
9 o( X3 i4 n* k) C: Z- a9 `

1 }( T1 d$ R# g' ?
7 d. y7 s/ L6 q# k  S0 @- L记得最后在工程里添加串口初始化的函数哦!!  e7 o' m% b" J% O. r: W
+ y8 f8 D; z: N# V1 u4 c
4.编写如下的串口处理代码5 C% a0 ~5 R: r2 t' h# _
" q  e& s+ G" o4 k
再来看下这个代码的含义:
7 M9 c' K* g( P* bUsart_RecCheck是数据接收检查的函数
1 k9 h% a1 u% Q" D1 V( `8 N第一个入口参数是串口结构体的指针,串口1-4分别对应g_tUart1-g_tUart4,这个函数对四个串口均有效
" _1 U6 S/ X: M9 t/ l% M" v. z; H第二个入口参数是运行时间,因为要用超时处理,这里需要提供时间间隔,所以本次时刻减去上一次的时刻就是时间间隔
6 g% Y$ U, j+ N2 ^, L/ w4 G
' x" r% x& l+ A4 X) r函数返回值是当前状态  0:未接收到数据   1:接收中   2:接收完成(超过一定的时间没有收到表示接受完成), `& |& ~' v# O5 d

1 W; z  x4 j  C$ H( [" kUsart_Send是数据发送的函数: P9 t- ~- @" A
" a& X2 \6 C$ ~$ P( U3 h# @, W
第一个入口参数是串口结构体的指针,串口1-4分别对应g_tUart1-g_tUart4,这个函数对四个串口均有效
  w6 ?2 N6 w- v: t9 P
) r+ H$ g8 C7 Y% J* r第二个入口参数是要发送的数据
' f/ A& H( a3 J; w第三个入口参数是要发送的数据长度
0 R8 V( C0 k  S8 p% H. s- k+ F
* v9 r9 V& R* o7 R( e4 L' ]8 t1 D  ^& E& j+ c* Y
Usart_RecSet是数据接收初始化的函数(用的DMA接收数据,没有超出缓冲区就不会触发DMA接收完成中断,这里用的软件超时中断来判断接收完成,用STC32G8K64可以用串口超时寄存器)4 w# ~0 O1 Y9 H+ J3 w' q

; N5 }# U: w" A- c% y. u- l# G8 d! L; p0 U7 G
第一个入口参数是串口结构体的指针,串口1-4分别对应g_tUart1-g_tUart4,这个函数对四个串口均有效
. l  J3 C$ d4 e/ s6 L' h) Q6 N) Z) v5 K6 d" j" K/ a- X3 F
第二个入口参数是超时时间,超过一定时间没有接收到数据表示错误,Usart_RecCheck会返回0xff
8 b! [. Y2 t$ O9 f7 X+ |1 V  o3 L% k0 p& B  m  i
& ~7 _' b) {* x/ x
因为接受到的数据会保存到g_tUart1.g_RxBuf这个数组里,所以直接调用这个数组返回即可, 这里检测的是g_tUart1,也就是串口17 T7 _1 O8 c8 |6 ?. M

8 r( z4 a1 _$ @编写完成之后开始编译:- h9 Q. ^+ P  I" B
* j9 f' N( @' f' G% V9 @
这里编译完0错误,再来下载,记得要改下图的参数,
" d0 j8 |  K! ?
! g4 G+ z& \: m* i/ G

5 w% U" U6 Q9 p, A6 _4 n3 F1 p
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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