
本节详细说明如何在本项目中新增串口通信,将超声波距离 dist_cm 通过 USART1 发送到电脑串口。 1. 目标与环境 MCU: STM32F103C8T6 串口: USART1 (PA9 TX, PA10 RX) 波特率: 115200 8N1(无校验,无流控) 工具链: Keil MDK / ARMCC 5.06 2. 新增文件 头文件与实现放在 Hardware/ 目录: #ifndef __USART_H #define __USART_H #include "stm32f10x.h" #include <stdint.h> void USART1_Init(uint32_t baudrate); void USART1_SendChar(char c); void USART1_SendString(const char *s); void USART1_SendNumber(uint32_t num); #endif #include "USART.h" void USART1_Init(uint32_t baudrate) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // PA9 TX GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; // PA10 RX GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = baudrate; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); } void USART1_SendChar(char c) { while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); USART_SendData(USART1, (uint16_t)c); } void USART1_SendString(const char *s) { while (*s) { USART1_SendChar(*s++); } } void USART1_SendNumber(uint32_t num) { char buf[12]; int i = 0, j = 0; char tmp; if (num == 0) { USART1_SendChar('0'); return; } while (num > 0 && i < (int)(sizeof(buf))) { buf[i++] = (char)('0' + (num % 10)); num /= 10; } for (j = 0; j < i / 2; j++) { tmp = buf[j]; buf[j] = buf[i - 1 - j]; buf[i - 1 - j] = tmp; } for (j = 0; j < i; j++) { USART1_SendChar(buf[j]); } } 将上述两个文件添加进 Keil 工程:Project.uvprojx → Hardware 组已加入 USART.c/.h(如未加入,请在工程里右键组名 → Add Existing Files…)。 3. 硬件连接 PA9 → USB 转串口模块 RX(注意是对接到对方的 RX) PA10 ← USB 转串口模块 TX(如仅发送可不接) GND ↔ GND 共地 串口工具设置:波特率 115200,8-N-1,无流控。 4. 在 main 中初始化与发送 在 User/main.c 中包含头文件并初始化串口,同时将距离通过串口发送到 PC。 #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h" #include "ultrasonic.h" #include "USART.h" int main(void) { /*模块初始化*/ OLED_Init(); //OLED初始化 Ultrasonic_Init(); //超声波初始化 USART1_Init(115200); //串口初始化(115200 8N1) /*OLED显示*/ OLED_Clear(); OLED_ShowString(1, 1, "Ultrasonic:"); while (1) { float dist_cm = UltrasonicGetLength(); OLED_ShowString(2, 1, "Dist(cm): "); { uint32_t d10 = (uint32_t)(dist_cm * 10.0f + 0.5f); // 四舍五入到一位小数 uint32_t intPart = d10 / 10; 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="); USART1_SendNumber(intPart); USART1_SendChar('.'); USART1_SendNumber(fracPart); USART1_SendString("cm\r\n"); } Delay_ms(200); } } 5. 常见问题与排错 无法编译,提示 stm32f10x.h 找不到: 确认 Keil 工程 C/C++ Include Path 包含 ./Start; ./Library; ./User; ./System; ./Hardware。 USART1_Init 等函数隐式声明: 确认 User/main.c 已包含 #include "USART.h"。 电脑无数据: 检查波特率设置一致;检查 TX 线连接是否正确,GND 是否共地。 若只接 TX/GND,PC 只能接收;如需从 PC 发回 MCU,再接 RX。 波特率更改: 将 USART1_Init(115200) 替换为所需值(如 9600),PC 工具一并修改。 6. 可选增强 增加 printf 重定向到 USART,便于调试。 加环形缓冲区与中断接收,支持命令解析与上位机交互。 采用 DMA 发送以降低占用。 |