|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 岁月如歌21 于 2025-11-17 17:23 编辑
3 ^" P; B) s1 V# q1 O
% ^: y8 T \, g6 ]- H/ t3 x( _ModBus_RTU(4组串口任选+DMA传输的主/从机)的lib库使用,STC32位8051实现- w- h: |$ m) I8 A8 e. W7 @4 ]
一、准备好自己的代码工程& C) X& M1 Z) D% B$ A
这里以STC32位8051的点灯工程为例
0 E2 N2 h( ]; h
( I7 _% w7 \. X# t编写该代码,可以看到这个0错误,下载进去之后可以看到屠龙刀板子上的P2端口的8个LED开始闪烁,表示这个代码工程无问题
% d( `" T ~6 Q; A6 I
" }# F B9 I5 q6 [% J; Y1 j
3 k: I J& B" Y/ p8 [# `二、添加库文件到自己的工程里里/ {7 X" {; u6 ^2 R. r
1.添加附件代码包到工程里; Y5 f3 f3 k+ m; j
; ~3 k- ^. y8 p8 g
2.然后按照如下方法调用一下头文件的路径) D5 x- y" H9 R
0 g. O2 I8 j6 O3 j, z4 x
3.将库文件添加到工程列表3 b6 X) N, K$ u
% Q' Z, m, \3 d& [: v! ]4.修改配置文件" W+ F9 d: r2 y3 J, Z
4.1头文件
3 g# C: X/ }( p* }
+ X4 M! M# X* _. t因为用到了串口,在115200的波特率下,我一般用这个系统时钟,后面所有要使用系统时钟的地方均需要调用config.h,调用这个MAIN_Fosc的宏来获取系统时钟,
7 N( E2 @% h) ]( x X t
9 m! K; K3 ]6 z" v J' P% H& r
由于原来的工程里也有,且宏定义名称都一样,所以只需要把这个宏删掉,然后修改调用的头文件为config.h即可+ z3 d& |- _/ n0 P8 g9 P; Q
4 J( b2 E% z) f3 P4 _6 t
4.3宏定义) P& a/ s* K6 _
' \+ m6 [" P2 V7 g8 z! D7 b1 j
如果自己的工程里也有这部分的宏定义,可以屏蔽自己的,统一调用这个config.h来获取数据。
; r$ L; p0 m* ^# g) m6 l6 u( H8 K+ C7 ]! p7 Z3 i3 e% W- y
5 ^6 |% a6 u, X
5按照如上的代码改完,工程应该可以编译通过了
3 c4 j6 {8 D6 m/ q: X$ \3 N7 l
% a- F* A. N" ]& ~+ i
可以看到工程已经0错误,0警告了
A2 {3 b. d9 E+ O! c% A- u
. i" I3 H% `8 S4 Y9 E) i7 c三、开始测试串口收发的代码' X5 j' B4 N3 J1 N9 T: ^# ?
1添加系统时钟计时变量
# `1 J& y# A& U: o: Y5 [
+ t& ~+ k6 y1 H/ f- k( f: e+ {
主函数添加这一变量,用来记录系统运行的上一次的时刻
. u2 F+ {, F: `! D
) b8 \, z, O+ h5 z" }$ a2.添加头文件到代码里! _ e6 x. i! L, V8 R
# i. G! n. K p这个是串口和485口的配置头文件,配合lib文件一起使用的7 k" x0 j- V1 e& e8 a1 T. L% o
7 o/ J) v3 X( p+ V* k3选择串口的参数
5 [4 P' h4 i* h) _9 \9 Z6 `
+ W4 k9 U+ y) c8 I. } u6 a
7 [$ T0 |6 Q7 E! ^5 V. {
. V; |: {5 ^4 H5 A) r记得最后在工程里添加串口初始化的函数哦!!; _. ?( v* T4 j$ g0 u
. T f4 E1 W W1 Z
4.编写如下的串口处理代码9 J( r/ |, q j* f
8 l$ B. K" i' z; o6 Z9 z
再来看下这个代码的含义:4 {% a6 z# Q+ a" D4 h
Usart_RecCheck是数据接收检查的函数
* @* K- E% i: w5 R1 w第一个入口参数是串口结构体的指针,串口1-4分别对应g_tUart1-g_tUart4,这个函数对四个串口均有效
9 h" I' ?( p& D' n% d" T第二个入口参数是运行时间,因为要用超时处理,这里需要提供时间间隔,所以本次时刻减去上一次的时刻就是时间间隔) C9 U, E' I! P, u* _$ [
. K# ^6 U: n6 f& y( k V函数返回值是当前状态 0:未接收到数据 1:接收中 2:接收完成(超过一定的时间没有收到表示接受完成), H& f& Y5 j2 B4 \/ |- a- {7 W# p
' X3 E' n' f- @% r) |# R" KUsart_Send是数据发送的函数
! H# A& b' W8 m4 Y
. q; x9 D! ?% F/ Q* W9 R/ |& |第一个入口参数是串口结构体的指针,串口1-4分别对应g_tUart1-g_tUart4,这个函数对四个串口均有效, y1 t# H$ T/ |
) ]" v2 @/ h+ u4 T第二个入口参数是要发送的数据( X. W! {) d! h3 T+ i* o, X- ~
第三个入口参数是要发送的数据长度
. p9 D$ h" w5 i' x4 {) b w* F6 Y' M& a& _' j
: _: b* B: {' k: M. z, U0 KUsart_RecSet是数据接收初始化的函数(用的DMA接收数据,没有超出缓冲区就不会触发DMA接收完成中断,这里用的软件超时中断来判断接收完成,用STC32G8K64可以用串口超时寄存器)
) f5 c0 ^0 V. F: N. R3 E
: E8 Y B7 s) q* j7 Z3 s/ ?# W2 [1 w. l# r1 C! Q
第一个入口参数是串口结构体的指针,串口1-4分别对应g_tUart1-g_tUart4,这个函数对四个串口均有效
0 Z9 l3 d8 j8 K/ b8 G. y0 ]& c0 X& ]/ s6 U
第二个入口参数是超时时间,超过一定时间没有接收到数据表示错误,Usart_RecCheck会返回0xff
+ a+ @2 w8 q, z2 C2 E+ f3 Q; e0 T! r& Z* Y9 ?/ r! O( s
& m* a( D& l! Z `) }& O因为接受到的数据会保存到g_tUart1.g_RxBuf这个数组里,所以直接调用这个数组返回即可, 这里检测的是g_tUart1,也就是串口1
6 W5 T" O3 q/ _- h7 ^
* A: H1 O# k2 E& }+ G9 b0 e, X* A编写完成之后开始编译:
# s( o B+ i+ ~: Z: ~; x/ }
1 R: l8 u; j3 S% t
这里编译完0错误,再来下载,记得要改下图的参数,
~% N: V7 D1 U5 j: c
2 I6 P# ]1 U" N; ?1 F& n
3 O$ I' b" Z9 P7 r( |$ I C
|
|