|
本节详细说明如何在本项目中新增串口通信,将超声波距离 dist_cm 通过 USART1 发送到电脑串口。1 s( ~1 _$ D" i/ f* k0 u ) G0 s" b1 }& Q( ~- D 1. 目标与环境 MCU: STM32F103C8T6 串口: USART1 (PA9 TX, PA10 RX): d2 _8 v. O2 x 波特率: 115200 8N1(无校验,无流控) 工具链: Keil MDK / ARMCC 5.060 k% |5 L' j' Y7 B0 r( d& E 2. 新增文件 头文件与实现放在 Hardware/ 目录:5 w. r5 `. u, } #ifndef __USART_H: |5 b2 h$ I* `% J7 L2 q4 A #define __USART_H# O* ?1 t2 j3 F1 k( L #include "stm32f10x.h"4 [& P$ |& H, [2 D, h( k3 p #include <stdint.h>: ]: k( [+ }. K! C }" O) V void USART1_Init(uint32_t baudrate); void USART1_SendChar(char c);7 t" T. E& @! s void USART1_SendString(const char *s); void USART1_SendNumber(uint32_t num); 0 n- G! o* X/ ?$ Q+ p/ g #endif+ j d- S- ?7 L# } 2 E. D) J P6 K' S* ^/ m2 G : X/ r0 |6 s9 a% A, p" ~ #include "USART.h"- u6 u# W7 \# P ) [( g6 v5 P9 R: b+ F! D void USART1_Init(uint32_t baudrate) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure;+ Z2 u5 ~6 ]; t Y" X 8 M2 @0 ~& k) c. m7 I RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // PA9 TX# Q0 k# \3 c& L0 Q5 o7 K8 ^ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;0 W+ Z6 u* y8 R2 p6 q. j GPIO_Init(GPIOA, &GPIO_InitStructure);. ^4 T/ o' k, E) u3 R 6 g5 m; m1 q1 [, H. I$ M5 Z GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // PA10 RX GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;' F; Q; |7 c- o! j0 }0 y GPIO_Init(GPIOA, &GPIO_InitStructure); # D8 U5 J: ]' z% [. l4 D' [ USART_InitStructure.USART_BaudRate = baudrate; USART_InitStructure.USART_WordLength = USART_WordLength_8b;7 A2 S+ r b5 T. I1 G; ~2 G: r* T USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No;- W* ~# j/ B' r- K9 V4 N% p& t USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;, x9 H2 j) Y X" M USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART1, &USART_InitStructure);" A) P e1 B6 z6 P USART_Cmd(USART1, ENABLE);9 _- A, N( z$ i( ^2 h } void USART1_SendChar(char c)- J/ p2 ^, [; f* m) b {0 O2 K9 S7 k e# _" h5 m" h while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); USART_SendData(USART1, (uint16_t)c);1 w8 A ^" M; z/ h }7 L9 @. {& E9 y/ {' v G& D d + t3 d6 ?* G( V" Q3 R void USART1_SendString(const char *s) {7 d) k1 n1 `5 ~0 y6 P while (*s)8 N2 s) v# V. _7 B4 N+ Z {7 Q. a5 w0 u' e, A' g" c USART1_SendChar(*s++); }/ F4 U e u+ A: e% I* Q }" G9 g5 @4 B& P6 L/ E " W- W) j: j0 }; [6 C void USART1_SendNumber(uint32_t num)$ Z/ j$ E; E) V' I { char buf[12]; int i = 0, j = 0; char tmp;- K$ U% S, \2 a+ B) e: j if (num == 0) { USART1_SendChar('0'); return;! P, T9 W1 i8 s3 l D' v# X } while (num > 0 && i < (int)(sizeof(buf))) {2 i0 h( J6 _+ j. G# J buf[i++] = (char)('0' + (num % 10)); num /= 10;; H; z# E6 e$ n% I2 R" t } for (j = 0; j < i / 2; j++)3 r: Z. x, C6 a& N2 R {& v* N& |7 O3 h tmp = buf[j]; buf[j] = buf[i - 1 - j];$ } b. I9 f* z. U: i: ~ buf[i - 1 - j] = tmp; } for (j = 0; j < i; j++) { USART1_SendChar(buf[j]);/ I; @4 z8 K: z0 y) c0 Q& _4 ^1 ] } } ' \6 I: A9 m( J9 e2 R8 y$ N: p 3 p+ [; Y' W$ L4 g, h* \ 将上述两个文件添加进 Keil 工程:Project.uvprojx → Hardware 组已加入 USART.c/.h(如未加入,请在工程里右键组名 → Add Existing Files…)。( k( o* h( Q! Q; J: A( c. W* \2 B& x 3. 硬件连接8 i1 o, J2 [$ p7 I9 U: g PA9 → USB 转串口模块 RX(注意是对接到对方的 RX)1 ~0 w. B6 J1 c' F% `3 ` PA10 ← USB 转串口模块 TX(如仅发送可不接) GND ↔ GND 共地7 t+ p, K, v0 J1 l9 J' f7 W3 v. ] 串口工具设置:波特率 115200,8-N-1,无流控。) H; l2 @+ m( m; Y 4 W' {& I, b7 Q) f+ }$ P1 [ 4. 在 main 中初始化与发送 在 User/main.c 中包含头文件并初始化串口,同时将距离通过串口发送到 PC。 #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h"" L B8 f' n$ H2 e* { #include "ultrasonic.h"' x: r' I: k, K: U' m! h( _ #include "USART.h") i7 R, X2 e9 C, k; d I; { int main(void)8 S2 X' l3 q. ?% V6 N/ F4 r# X {$ h* I0 F5 \3 }# g /*模块初始化*/ OLED_Init(); //OLED初始化 Ultrasonic_Init(); //超声波初始化 USART1_Init(115200); //串口初始化(115200 8N1) * F c* G- u$ R: C: u0 G4 E$ O B /*OLED显示*/' V0 g5 P# I) b: x, s$ M OLED_Clear();! j4 y/ x# D# F- z OLED_ShowString(1, 1, "Ultrasonic:"); while (1)0 _, z; t3 F$ @+ @2 e% j {6 y( d4 U' p3 }+ G; x7 k( z float dist_cm = UltrasonicGetLength();/ j3 e# w1 S2 @, y4 ] OLED_ShowString(2, 1, "Dist(cm): ");% t A. Y( }- n* _ { uint32_t d10 = (uint32_t)(dist_cm * 10.0f + 0.5f); // 四舍五入到一位小数 uint32_t intPart = d10 / 10;$ U' w3 n8 D2 |) Q uint32_t fracPart = d10 % 10; OLED_ShowNum(2, 11, intPart, 4); OLED_ShowChar(2, 15, '.'); OLED_ShowNum(2, 16, fracPart, 1); // 串口输出:如 123.4cm\r\n USART1_SendString("dist=");6 `( k) G k5 } USART1_SendNumber(intPart);3 I- @& ?2 h: ? USART1_SendChar('.');0 A) d9 X7 I( Y* _+ I, {1 ` USART1_SendNumber(fracPart); USART1_SendString("cm\r\n");5 V. `$ w6 L9 n9 `* t' k }( G) J$ L, {' s i% m Delay_ms(200); } } , f+ h7 @6 E% f4 c; p, s% w 6 N3 @- D+ Q u$ ~! I l! t : t; a5 u1 B; b 5. 常见问题与排错0 j& ^4 C$ k4 b' j8 }3 c3 m 无法编译,提示 stm32f10x.h 找不到:$ h4 Y8 }; W1 q6 O- w 确认 Keil 工程 C/C++ Include Path 包含 ./Start; ./Library; ./User; ./System; ./Hardware。 USART1_Init 等函数隐式声明:/ M* @/ }$ Y3 J 确认 User/main.c 已包含 #include "USART.h"。 电脑无数据: 检查波特率设置一致;检查 TX 线连接是否正确,GND 是否共地。9 b) ?5 d; f6 K# m1 Y3 o+ w 若只接 TX/GND,PC 只能接收;如需从 PC 发回 MCU,再接 RX。7 b( D1 V' c; R0 v% G 波特率更改: 将 USART1_Init(115200) 替换为所需值(如 9600),PC 工具一并修改。 6. 可选增强# p' X2 a* }* Q" D5 e5 d 增加 printf 重定向到 USART,便于调试。 加环形缓冲区与中断接收,支持命令解析与上位机交互。 采用 DMA 发送以降低占用。 |
STM32L562DK探索板——串口通讯测试成功
STM32L562DK探索板——再试串口通讯仍不成
实战经验 | 基于STM32G0B1的全桥移相+同步整流PWM解决方案
STM32L562DK探索板——串口通讯的再测试
STM32L562DK探索板——串口通讯的测试
STM32L562DK探索板——运动传感器测试
STM32L562DK探索板——继续深入了解Audio Play的工作流程
STM32L562DK探索板——触摸菜单实验之触摸测试
STM32L562DK探索板——触摸菜单实验之LED闪烁
STM32L562DK探索板——Audio Play的再了解
微信公众号
手机版