当前位置: 首页 > news >正文

GD32F303实战【4】串口通信从零到一:配置、收发与调试

1. 串口通信基础:从概念到硬件连接

第一次接触GD32F303的串口功能时,我完全被各种术语搞晕了。USART、UART、波特率、数据帧...这些名词听起来很专业,其实理解起来并不难。让我用最直白的方式给你解释清楚。

串口通信就像两个人用对讲机通话。对讲机需要约定好相同的频道(波特率),说话要有开始和结束的标记(起始位和停止位),还要确认对方是否听清楚了(校验位)。在GD32F303上,USART0就是我们最常用的"对讲机频道",对应PA9(TX)和PA10(RX)两个引脚,TX负责发送数据,RX负责接收数据。

硬件连接特别简单,你只需要:

  • 用USB转TTL模块连接开发板
  • 模块的TX接开发板的RX(PA10)
  • 模块的RX接开发板的TX(PA9)
  • 共地连接(GND接GND)

我刚开始总把TX和RX接反,导致数据传不出去。后来记住一个口诀:"发对收,收对发",就是开发板的TX接模块的RX,开发板的RX接模块的TX。

2. USART与UART的区别:同步还是异步?

很多新手会困惑USART和UART的区别。简单来说,UART只能异步通信,而USART既支持异步也支持同步。就像手机的通话功能(同步)和短信功能(异步)的区别。

在GD32F303上,我们通常使用异步模式,这时USART和UART的用法完全一样。同步模式一般用于特殊场景,比如驱动SPI设备。异步通信的优势是不需要时钟线,接线简单;缺点是传输速率不能太高,且需要双方约定好相同的波特率。

我实测过GD32F303的USART0,在115200波特率下非常稳定。高于这个速率时,偶尔会出现数据丢失,所以建议新手先用这个波特率。

3. 串口初始化配置:一步一步来

配置串口就像设置对讲机,需要把各个参数都调对。下面是我调试多次后总结的最佳配置方案:

void uart0_init(void) { // 1. 开启时钟 rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_USART0); // 2. 配置GPIO引脚 gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9); // TX gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10); // RX // 3. 复位USART usart_deinit(USART0); // 4. 设置波特率115200 usart_baudrate_set(USART0, 115200U); // 5. 使能接收和发送 usart_receive_config(USART0, USART_RECEIVE_ENABLE); usart_transmit_config(USART0, USART_TRANSMIT_ENABLE); // 6. 使能USART usart_enable(USART0); }

这里有几个容易出错的地方:

  1. 忘记开启GPIO时钟和USART时钟(我就犯过这个错)
  2. TX引脚要配置为复用推挽输出,RX配置为浮空输入
  3. 波特率设置要准确,常用的有9600、115200等

4. 数据发送:三种常用方式

实际项目中,我们需要发送不同类型的数据。我整理了三种最常用的发送函数:

4.1 发送单个字节

void uart0_send_byte(uint8_t ch) { usart_data_transmit(USART0, ch); while(RESET == usart_flag_get(USART0, USART_FLAG_TBE)); }

这个函数会等待发送完成才返回。TBE标志位表示发送缓冲区为空,可以发送下一个字节。

4.2 发送字符串

void uart0_send_string(uint8_t *str) { while(*str) { uart0_send_byte(*str++); } }

使用时直接传入字符串指针,比如:

uart0_send_string("Hello GD32F303!\r\n");

4.3 发送任意数据数组

void uart0_send_data(uint8_t *data, int len) { for(int i=0; i<len; i++) { uart0_send_byte(data[i]); } }

这个函数特别适合发送传感器数据或自定义协议数据。

5. 中断接收数据:高效处理方案

串口接收最可靠的方式是使用中断。下面是我在实际项目中验证过的稳定方案:

#define BUFFER_SIZE 100 uint8_t uart0_rx_buff[BUFFER_SIZE]; uint16_t uart0_rx_index = 0; void USART0_IRQHandler(void) { if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)) { uint8_t ch = usart_data_receive(USART0); if(uart0_rx_index < BUFFER_SIZE) { uart0_rx_buff[uart0_rx_index++] = ch; // 检测到回车换行认为一条命令结束 if(ch == '\n' || ch == '\r') { process_command(uart0_rx_buff, uart0_rx_index); uart0_rx_index = 0; } } else { // 缓冲区溢出处理 uart0_rx_index = 0; } } }

使用中断接收需要注意:

  1. 在主程序中开启USART中断
  2. 在NVIC中配置USART0中断优先级
  3. 缓冲区大小要合适,太小容易溢出,太大浪费内存

6. 调试技巧:串口助手的使用

调试串口时,一个好用的串口调试助手能事半功倍。我推荐使用以下功能:

  1. 自动添加回车换行(发送时勾选"加回车换行")
  2. 十六进制显示(调试二进制数据时特别有用)
  3. 定时发送功能(测试通信稳定性)

常见问题排查:

  • 如果收不到数据:检查接线是否正确,波特率是否匹配
  • 收到乱码:检查地线是否接好,波特率是否准确
  • 数据不完整:降低波特率试试,或者检查缓冲区大小

7. 实战案例:温度传感器数据上报

最后分享一个真实案例:通过串口上报温度传感器数据。硬件连接DS18B20到GD32F303,每1秒上报一次温度。

while(1) { float temp = read_temperature(); char buffer[50]; sprintf(buffer, "Temperature: %.2fC\r\n", temp); uart0_send_string(buffer); delay_ms(1000); }

这个简单的例子包含了串口初始化和数据发送的全部要素。你可以在此基础上扩展,比如加入校验、协议头等。

http://www.jsqmd.com/news/1046092/

相关文章:

  • Axure RP中文汉化终极指南:3分钟免费实现界面本地化
  • 校园邮箱Outlook配置全攻略:从IMAP/SMTP到SSL端口详解
  • Token中转站:AI浪潮中的阶段性产物,机遇与风险并存
  • 从内存扫描到指针寻路:Cheat Engine实战解析《植物大战僵尸》游戏机制
  • 2026市面上评价高的屏幕贴合机设备生产商排行 - 品牌排行榜
  • 沃锐智能:上海市折盖封箱机优选,3大核心优势解行业痛点,折盖封箱机供应商 - 品牌推荐师
  • VR视频转换:如何用免费工具将沉浸式3D内容转为可交互2D体验
  • 2026年适配知网降AI率平台横评:亲测8款工具,将AIGC特征彻底弱化淡化
  • U-Boot配置进阶:从defconfig到Kconfig的图形化配置实战解析
  • Jensen不等式实战解析(一)——从信息论到机器学习
  • Vue实战:从摄像头捕获到图片上传的一站式解决方案
  • S12ZDBGV2调试模块:嵌入式精准调试的硬件利器
  • 机器学习系列3:从能量视角看模型优化与泛化
  • 2026年新发布:聚焦泉州,解析合成纤维优质厂商的崛起路径与选型逻辑 - 品牌鉴赏官2026
  • MATLAB Robotics Toolbox 可视化报错深度剖析:从“索引越界”到一劳永逸的修复
  • LeagueAkari:英雄联盟客户端工具包的三大核心技术突破与实战指南
  • MATLAB R2011b函数名大小写敏感问题:历史成因、诊断与跨平台解决方案
  • Sigma-Delta ADC中sinc3抽取滤波器的硬件优化与Verilog实现
  • 技术揭秘:猫抓如何实现MPD/DASH多格式流媒体解析 | 完整实践指南
  • 深入解析ColdFire中断控制器:架构、配置与实战优化
  • 从“客观特征”到“上下文依赖”:BatchNorm与LayerNorm的本质差异与场景选择
  • 2026红河漏水检测维修精选优质服务商TOP5推荐!卫生间漏水/厨房漏水/屋顶天花板漏水/阳台漏水/地下室漏水防水补漏检测维修-正规防水补漏公司优选口碑榜测评推荐 - 即刻修防水
  • MC68HC908AP SCI模块深度解析:寄存器配置、中断处理与低功耗实践
  • 2026年6月,寻找靠谱的弹性卡簧直销工厂?这份产业格局与代表服务商分析为您指路 - 品牌鉴赏官2026
  • 5分钟快速上手pot-desktop:免费跨平台划词翻译与OCR识别神器终极指南
  • 深入解析802.11ax HE-SIG-B:高效MU-MIMO与OFDMA资源分配的关键信令
  • Windows热键侦探:快速找出谁“偷走“了你的快捷键组合
  • FluentTerminal:为什么这款现代终端模拟器值得你尝试?
  • 逆向闲鱼App:从x-sign到x-mini-wua的请求参数全解析
  • HarmonyOS6踩坑记录之 ArkTS 手势打架?我花了两天搞透 List + Swiper + Refresh 三层嵌套的手势治理