|
|
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 |
|