|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 岁月如歌21 于 2025-11-17 17:23 编辑
- g4 d0 k$ O2 p( G4 q! S7 H3 g4 ^: f" P8 A8 V" T5 {
ModBus_RTU(4组串口任选+DMA传输的主/从机)的lib库使用,STC32位8051实现1 L9 L3 \5 `% A, O, n
一、准备好自己的代码工程
' a) ^; o2 \, W$ I# R这里以STC32位8051的点灯工程为例. ~) S- o) O2 I" x& f( N6 E
0 T9 _0 ~( M7 G9 D' r编写该代码,可以看到这个0错误,下载进去之后可以看到屠龙刀板子上的P2端口的8个LED开始闪烁,表示这个代码工程无问题
7 W' c2 f5 V: k2 z9 \
; G) i* G" L+ m0 c( H: k: A+ s9 q! e k
二、添加库文件到自己的工程里里 A5 F% {9 Y1 C
1.添加附件代码包到工程里5 y% G2 @, Z& Y* l3 w! s; w
: u; Y# Q+ r- g& U' D+ z' w# B; e& t& b2.然后按照如下方法调用一下头文件的路径
0 ~/ C3 I+ i" n" f5 S
& N2 i1 u2 Q! o' R W3.将库文件添加到工程列表; _) U1 {- c+ L$ V
' g: z5 F1 v1 L
4.修改配置文件4 t6 K" v: x m& } Y6 M0 u
4.1头文件' t0 F1 ?6 p5 i
! I/ R E" l# B$ E0 }
因为用到了串口,在115200的波特率下,我一般用这个系统时钟,后面所有要使用系统时钟的地方均需要调用config.h,调用这个MAIN_Fosc的宏来获取系统时钟,
5 T" s! J! @. l
& b6 \7 w5 H( @- k& V* n
由于原来的工程里也有,且宏定义名称都一样,所以只需要把这个宏删掉,然后修改调用的头文件为config.h即可( W4 [1 @, W2 t
# f( ~- s9 b6 }* K% `$ P4.3宏定义# C, Q1 P% d# b, Q) ~+ g7 [
" X3 R& j- `' l: v+ a如果自己的工程里也有这部分的宏定义,可以屏蔽自己的,统一调用这个config.h来获取数据。' r& g+ S6 X" H, _& C7 I* F! E
- ]" J9 ^$ i$ g
8 n6 Q' k& d8 m0 S5按照如上的代码改完,工程应该可以编译通过了
k. B5 L* K4 R
' V- i' z( M* p可以看到工程已经0错误,0警告了; B/ }. q0 S* M
% n" N, J! o/ `& t: `8 s9 k三、开始测试串口收发的代码
8 o/ p4 ]* X: X7 N1添加系统时钟计时变量
" j9 H+ l$ H0 M! V4 z1 W& W" y
+ @- J2 u! A) I. Q. S4 r3 V0 m
主函数添加这一变量,用来记录系统运行的上一次的时刻) n/ h& f) J& S/ }
5 O$ r5 y1 d( ~ z$ k0 h: u' ~
2.添加头文件到代码里: @% m' Q1 R, `0 Q, S
' x" { q1 `7 c2 {5 y
这个是串口和485口的配置头文件,配合lib文件一起使用的: \) W# E, S; _! J
( C* F- z! k& P" u3选择串口的参数
5 E$ @+ |# `3 @
+ T/ `/ N. o2 z
& h' u, h1 m% W# e
8 @$ ~/ c3 D- K3 [9 }. J
记得最后在工程里添加串口初始化的函数哦!!: t9 m3 o; W/ E* n+ V% S$ A
b/ Q$ ~8 A( ^
4.编写如下的串口处理代码
; |* ^4 i* n7 c x
' T+ ?6 \. A+ X* L
再来看下这个代码的含义:4 i9 d! I5 {4 d3 x" i* p9 E& r& p
Usart_RecCheck是数据接收检查的函数. S, t# c% W2 {, U+ ^
第一个入口参数是串口结构体的指针,串口1-4分别对应g_tUart1-g_tUart4,这个函数对四个串口均有效
' v' o) Z3 c4 x4 _. [6 j$ ~第二个入口参数是运行时间,因为要用超时处理,这里需要提供时间间隔,所以本次时刻减去上一次的时刻就是时间间隔, L3 K4 K8 Q& |7 C& K5 \, G5 o
! ?1 ]$ g: I5 F, ~, S& G
函数返回值是当前状态 0:未接收到数据 1:接收中 2:接收完成(超过一定的时间没有收到表示接受完成)
: q/ I& u' O6 T0 }- H& ?8 T: p6 x$ H. j+ g, g
Usart_Send是数据发送的函数7 f5 d$ a' \/ V
# e& A4 D- s7 t6 e4 ] [( A- z
第一个入口参数是串口结构体的指针,串口1-4分别对应g_tUart1-g_tUart4,这个函数对四个串口均有效* O5 ?& G6 Z! _3 K3 E( U2 N& f
% T+ f. f1 O- J- R! P2 [
第二个入口参数是要发送的数据
, w- t- y+ h2 R3 i+ P第三个入口参数是要发送的数据长度' X' @5 u* Y/ V# V" w% r
: Z% ?9 p( B# P1 M/ [& |
# a+ J! ^+ d9 e
Usart_RecSet是数据接收初始化的函数(用的DMA接收数据,没有超出缓冲区就不会触发DMA接收完成中断,这里用的软件超时中断来判断接收完成,用STC32G8K64可以用串口超时寄存器)) O; A& g0 T/ W, ?
6 C. M! y7 h3 o7 |, g( {5 h5 B7 b
9 h5 L+ u* R9 d( L! x: \* \第一个入口参数是串口结构体的指针,串口1-4分别对应g_tUart1-g_tUart4,这个函数对四个串口均有效# t3 s% T; P" J* F. K
* ~4 K) f' T# Z( r
第二个入口参数是超时时间,超过一定时间没有接收到数据表示错误,Usart_RecCheck会返回0xff" |, o ], c8 }! T8 A0 Y) C
: s: C6 h u' n; y0 Z2 n1 Q9 X ?% x) ^$ P* e/ @0 h& B+ A
因为接受到的数据会保存到g_tUart1.g_RxBuf这个数组里,所以直接调用这个数组返回即可, 这里检测的是g_tUart1,也就是串口1
; a# J5 G w' a9 y
$ o5 V7 j% @0 A8 D( C编写完成之后开始编译:
+ V5 X( i+ }: N* N9 D: {
+ T( j1 P; e2 I9 e3 g
这里编译完0错误,再来下载,记得要改下图的参数,
. K; R# K _ ~# a0 H) B j) t' K2 L6 ?9 x
: D* E3 ?( H( M+ ?1 o
& [) E( T# t! L* r0 K; K1 D |
|