|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 岁月如歌21 于 2025-11-17 17:23 编辑 / X0 f$ n* g4 z$ Q/ E: a* O! f
8 E3 H- p% x/ N# G) n. L9 a/ q1 _) m
ModBus_RTU(4组串口任选+DMA传输的主/从机)的lib库使用,STC32位8051实现
: o! @) j' _( i1 v0 b1 ^* K. P一、准备好自己的代码工程" N1 j$ Q9 b/ W; Z1 x) O: o
这里以STC32位8051的点灯工程为例0 ]. \. x* u' O3 @; q( p; ?3 O1 i1 L
9 \ |3 w; ?( I$ \/ R
编写该代码,可以看到这个0错误,下载进去之后可以看到屠龙刀板子上的P2端口的8个LED开始闪烁,表示这个代码工程无问题
/ ]: _. b7 n/ x8 _5 O. c) w" V# m! X! X$ M" z: h% k
5 J ]$ X5 p" |& y& b% k* W
二、添加库文件到自己的工程里里
( }, {& t0 j1 r( x2 q! ?1.添加附件代码包到工程里+ J, r- f% A8 g/ M% Y
' R, s8 @) X4 H- |9 I2.然后按照如下方法调用一下头文件的路径. w- N+ n3 G; H+ t! {
7 G4 \6 Z" r0 t, t o" g& H9 H2 z
3.将库文件添加到工程列表8 s1 h J$ E' n: i; v
]9 X& T5 M$ D2 W
4.修改配置文件& |8 N/ @& [4 O( G' }& W! M9 ~" L
4.1头文件2 ~/ v8 I3 w+ w7 s; M% ~! z! r
' q5 w# `/ r2 }( K" W8 y* m/ a0 h" n
因为用到了串口,在115200的波特率下,我一般用这个系统时钟,后面所有要使用系统时钟的地方均需要调用config.h,调用这个MAIN_Fosc的宏来获取系统时钟,# j$ n9 D5 B+ Y* ]8 M
, a( t2 e+ t: ~8 X( _由于原来的工程里也有,且宏定义名称都一样,所以只需要把这个宏删掉,然后修改调用的头文件为config.h即可
, H. k, C" C! ?& `7 b( U# X: ]& }
4.3宏定义
+ J5 ^% m. }( u& P# L
1 \% M" U2 D5 O+ M
如果自己的工程里也有这部分的宏定义,可以屏蔽自己的,统一调用这个config.h来获取数据。% Q" P1 K0 Y# q. g2 Q8 |' Q
( ]3 Z9 g' k0 u5 Y, u: E D* }
. j- R. n7 a8 y; M% W5按照如上的代码改完,工程应该可以编译通过了
. P6 e3 m* G# B# ]2 L
# @4 T# i; W& N9 L' o: f; j. ^可以看到工程已经0错误,0警告了+ A4 Z6 S+ n6 E# s6 T" A
& n! B9 r2 j" z ^. {三、开始测试串口收发的代码
# E# [4 I; v6 K& Z+ W5 X# h1添加系统时钟计时变量+ }$ a5 E& t# b& [6 o
1 j% x; x, S0 D" ^主函数添加这一变量,用来记录系统运行的上一次的时刻
0 {8 r" ^/ e, k( a/ O' f5 T* T; j q# \9 g8 O
2.添加头文件到代码里
( y+ y& t+ K* z
' E5 j3 c5 a2 ^& S- R4 h# @0 \
这个是串口和485口的配置头文件,配合lib文件一起使用的7 l! r+ J* `# `0 Q0 f4 J
, w0 O8 X, j% u! ~" w# h j
3选择串口的参数3 U; v3 c3 ]1 x
/ Q* @5 D( u5 Z& J9 A
3 Z3 b! \9 Z8 R4 d
3 \& w2 n0 v* r- v6 |7 Y, o记得最后在工程里添加串口初始化的函数哦!!
& [9 J/ `- ~& w& _) j
2 O6 M/ O2 y# x4.编写如下的串口处理代码, ~) M- L1 Z( k# ]. [7 S
5 x: J; j& Z+ |% @* t$ {9 u& S. V7 s; j
再来看下这个代码的含义:0 k+ M! I/ ~3 c6 x9 m
Usart_RecCheck是数据接收检查的函数
, Y; Y7 t3 b! U& B1 s, }第一个入口参数是串口结构体的指针,串口1-4分别对应g_tUart1-g_tUart4,这个函数对四个串口均有效
! U/ ~0 R- q. z( c+ Y, U第二个入口参数是运行时间,因为要用超时处理,这里需要提供时间间隔,所以本次时刻减去上一次的时刻就是时间间隔
+ m5 y4 R: y1 W( x" P; k2 Y
$ b2 @9 ]: O4 s4 u( w函数返回值是当前状态 0:未接收到数据 1:接收中 2:接收完成(超过一定的时间没有收到表示接受完成)1 }, E( R; c+ A0 m+ Z# o
" f1 s9 y- G2 C3 |- OUsart_Send是数据发送的函数) m' j, e' a, Y, T8 e+ t' n. e3 u
8 X- ]5 ?& y: u5 h2 T8 k: a! f第一个入口参数是串口结构体的指针,串口1-4分别对应g_tUart1-g_tUart4,这个函数对四个串口均有效' @+ w; Z; B/ ]1 k, L2 M0 {. K- K7 T
3 G0 f! t6 B: J2 Z+ s. v" T2 ~
第二个入口参数是要发送的数据
6 b9 z1 ?! l9 ?1 [3 C( }) _第三个入口参数是要发送的数据长度9 E" G0 `1 I5 j9 ]& F
_, e! z' U- ~4 |9 d" L* U
7 [0 a4 E" B% r" v
Usart_RecSet是数据接收初始化的函数(用的DMA接收数据,没有超出缓冲区就不会触发DMA接收完成中断,这里用的软件超时中断来判断接收完成,用STC32G8K64可以用串口超时寄存器)
- p g, J" A7 o0 H' H5 d5 r7 s& X
" x7 Q a4 C& C6 X, P4 [6 @8 n0 D* H0 K4 D' T& L. w- o
第一个入口参数是串口结构体的指针,串口1-4分别对应g_tUart1-g_tUart4,这个函数对四个串口均有效
( ^& |+ o6 p" f/ O- h1 H) P* j3 U, b0 e* n: w9 l
第二个入口参数是超时时间,超过一定时间没有接收到数据表示错误,Usart_RecCheck会返回0xff# x1 _" ^* s8 m
+ S. }. x+ V2 c! ?3 X
- s, R/ h; k) L& a1 C因为接受到的数据会保存到g_tUart1.g_RxBuf这个数组里,所以直接调用这个数组返回即可, 这里检测的是g_tUart1,也就是串口1
1 Z0 I9 i/ _$ T. K6 Y2 e* ]! \! M, s( ]7 |. b. o7 n
编写完成之后开始编译:: z4 F. s& z* Z2 w/ `
6 m: U9 C% V0 Q8 m' Q2 C这里编译完0错误,再来下载,记得要改下图的参数,
! }1 D- ~7 C9 o" i
" ], J$ m( x: x4 _: Q( `4 G; m0 y3 s% m2 e* c
|
|