本节详细说明如何在本项目中新增串口通信,将超声波距离 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 发送以降低占用。
————————————————
版权声明:本文为CSDN博主「推推推特」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/grantthing/article/details/152001618
|
|