EDA365电子论坛网

标题: ModBus_RTU(4组串口任选+DMA传输的主从机)的lib库使用,STC32实现 [打印本页]

作者: 岁月如歌21    时间: 2025-11-17 17:11
标题: ModBus_RTU(4组串口任选+DMA传输的主从机)的lib库使用,STC32实现
本帖最后由 岁月如歌21 于 2025-11-17 17:23 编辑 - e" b$ H( n0 n

4 C. l' i. [2 F! p. d4 rModBus_RTU(4组串口任选+DMA传输的/机)的lib库使用,STC32位8051实现
' l+ a! |2 n  s$ T8 G. T一、准备好自己的代码工程
/ a7 c, a* u( e$ _' a: y这里以STC32位8051的点灯工程为例
: R* T8 J+ ]* X1 Y
: g: u" `5 ~. U" Q. ^! P2 }
编写该代码,可以看到这个0错误,下载进去之后可以看到屠龙刀板子上的P2端口的8个LED开始闪烁,表示这个代码工程无问题, Z6 {% [$ l+ o# m
' U& D, O* E/ v& R1 X( y( I" L9 M9 n
# I" ?* o/ D& ^7 M8 b. E' t
二、添加库文件到自己的工程里里
7 y  y* e2 q4 e: E7 @1 o2 i# J- V1.添加附件代码包到工程里8 m: U: \/ [2 e5 d$ C" _$ r

$ e) A: I; _" X# F2.然后按照如下方法调用一下头文件的路径+ X# G; _2 I7 Q* @" Y

5 \. K: [" A, T' }; R2 ]3.将库文件添加到工程列表; t! `: ]3 m! }& @1 i
  [5 Q/ j1 Y$ ~0 K8 `
4.修改配置文件
" \" F/ G$ m4 u" g5 ^2 @4.1头文件
/ \0 H2 B. P# Y9 t9 {6 q+ m
1 ~' \) u$ I" T/ \+ d2 `% e
因为用到了串口,在115200的波特率下,我一般用这个系统时钟,后面所有要使用系统时钟的地方均需要调用config.h,调用这个MAIN_Fosc的宏来获取系统时钟,
2 u$ r" q+ d& p) n. B

  N  _# n* p1 |7 y由于原来的工程里也有,且宏定义名称都一样,所以只需要把这个宏删掉,然后修改调用的头文件为config.h即可
) A* r+ m( I7 }
' S& r) k) i: ], \- N4.3宏定义
  F! r8 \3 p: x
0 `$ F. o* [8 d! K' K; a& z/ k
如果自己的工程里也有这部分的宏定义,可以屏蔽自己的,统一调用这个config.h来获取数据。) ]% B6 [0 B5 u) p6 h, b5 U

& o, P7 ^! L: v1 _2 X" T- T9 [  b2 g) H+ E2 x5 W$ F
5按照如上的代码改完,工程应该可以编译通过了
( z/ F* N- A& n4 v: p/ U

7 u) ]: P( a9 a3 d8 _/ `可以看到工程已经0错误,0警告了+ c$ m6 t, [0 B& Q; f, p4 Q6 Z

4 i, U0 m- t% ]$ v. P) ?三、开始测试串口收发的代码3 U" c. R4 g! u" k) i
1添加系统时钟计时变量: x9 ?( M( u# r+ P$ e

: {7 o! I- c5 G" G6 Z( n3 h主函数添加这一变量,用来记录系统运行的上一次的时刻
0 {, a/ M- T* k6 C6 e; G8 u8 C
" E, q/ L7 f/ m6 n8 y2.添加头文件到代码里6 ]$ V/ z) b" h7 B0 c0 \
( W$ W# {# X# C
这个是串口和485口的配置头文件,配合lib文件一起使用的% p( h7 o6 k# S5 |8 i; W2 P9 f
' |. A/ o) E2 c5 e- \; w) [
3选择串口的参数5 x0 Z7 h$ j. w& w/ i8 S- y

+ g. d/ ?4 A; _3 O3 j" Y" B) w
# Y5 r' w: R- b3 B- v2 @
. v- f  u+ V3 ]# G4 o记得最后在工程里添加串口初始化的函数哦!!
& c4 ?3 }/ B  K8 L: h2 M
0 L/ \0 |. X# U$ t6 C! e4.编写如下的串口处理代码3 G  i; q4 p4 w% ?* ?' P* k+ k
0 o: x, \) n) f3 S$ @5 Q
再来看下这个代码的含义:% c9 ^+ E. C  Y2 ~& p
Usart_RecCheck是数据接收检查的函数
8 q2 ?0 S% }( [8 {$ @+ e" \1 Z" I/ ^; J第一个入口参数是串口结构体的指针,串口1-4分别对应g_tUart1-g_tUart4,这个函数对四个串口均有效( _% k. P$ U- w7 _0 i; ^
第二个入口参数是运行时间,因为要用超时处理,这里需要提供时间间隔,所以本次时刻减去上一次的时刻就是时间间隔/ U% ]4 H. y  _+ p

/ R) I) Q: R2 }函数返回值是当前状态  0:未接收到数据   1:接收中   2:接收完成(超过一定的时间没有收到表示接受完成)
, B# ~. n6 I# W1 u- X4 s$ U  B# b) K
Usart_Send是数据发送的函数
" a& W, }6 j4 F# G9 |; c, c+ W$ U2 D$ ]8 o8 G+ `9 o
第一个入口参数是串口结构体的指针,串口1-4分别对应g_tUart1-g_tUart4,这个函数对四个串口均有效9 G2 \% y" ~. v8 t0 n' m

0 p% y3 T) p8 u' i第二个入口参数是要发送的数据/ S4 X! S/ e2 |) Y- \8 [# j: C$ [9 ]
第三个入口参数是要发送的数据长度
8 E5 {" @; H/ x. Z% F1 n* t& h: b: p1 b# z
+ X' K; {8 R& l: {+ A, J# U" i
Usart_RecSet是数据接收初始化的函数(用的DMA接收数据,没有超出缓冲区就不会触发DMA接收完成中断,这里用的软件超时中断来判断接收完成,用STC32G8K64可以用串口超时寄存器)9 p, X4 Y2 Y1 T# R

5 a: J, b: L) k/ }5 i' ]' R  P" @3 e! k6 f
第一个入口参数是串口结构体的指针,串口1-4分别对应g_tUart1-g_tUart4,这个函数对四个串口均有效: Y* A' ^+ _' H5 [

7 a+ y& h& `% Q) x& w+ Q! I. p第二个入口参数是超时时间,超过一定时间没有接收到数据表示错误,Usart_RecCheck会返回0xff
1 Q3 y4 d* E& g# b" ]( I4 c
9 K! o9 H! o: ~. t* n
/ F5 m0 s- y; J4 `因为接受到的数据会保存到g_tUart1.g_RxBuf这个数组里,所以直接调用这个数组返回即可, 这里检测的是g_tUart1,也就是串口1/ g) f8 T+ A- c& ^

$ V1 k. M/ U, J) L编写完成之后开始编译:; E1 Y+ p8 v6 {
( g+ H; p) T8 G4 p, O# z
这里编译完0错误,再来下载,记得要改下图的参数,2 p& T; x" C8 y) J$ M

/ B9 T: r: |" k) N3 _- N2 w8 D: }% }
/ y$ F1 ]/ x0 Y+ ]& f: z; Y; w




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2