你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32在原有工程中添加串口模块的详细说明

[复制链接]
flyingstar 发布时间:2025-10-14 18:09
本节详细说明如何在本项目中新增串口通信,将超声波距离 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 发送以降低占用。
收藏 评论0 发布时间:2025-10-14 18:09

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版