串口通信连续发送“hello windows!”

发布时间:2026/10/19 5:15:21
串口通信连续发送“hello windows!” 目录前言基础 1. 串口协议与电平标准基础 2. 串口传输文件实验任务一. 基于 STM32CubeMX 的串口通信任务二. 中断与 DMA 通信实验总结## 前言串口通信是嵌入式开发中最基础、最常用的通信方式之一。无论是调试程序、传输数据还是与传感器、上位机交互串口都扮演着不可或缺的角色。然而很多初学者在接触串口时往往被 RS-232、RS-485、TTL 电平、波特率、中断、DMA 等概念搞得一头雾水。本文以 STM32 为核心从最基础的串口协议讲起通过两个循序渐进的实验任务带你一步步掌握串口通信的核心知识基础篇先厘清 UART、TTL、RS-232、RS-485 等概念的区别再通过两台电脑之间的串口文件传输实验直观感受波特率与传输时间的关系。任务一使用 STM32CubeMX 配合 Keil基于 HAL 库实现 STM32 与上位机的双向通信包括连续发送、接收控制字符等经典场景。任务二深入中断与 DMA 通信原理用中断方式重做串口实验并实现 DMA 高速连续发送。无论你是刚入门嵌入式的新手还是想系统梳理串口知识的开发者本文都能为你提供一份清晰、可动手实践的参考。建议按照顺序阅读并亲手完成每个实验才能真正理解串口通信的精髓。基础 1. 了解串口协议和 RS-232、RS-485 标准以及 RS232、RS485 电平与 TTL 电平的区别了解“USB/TTL 转 232”模块以 CH340 芯片模块为例的工作原理。UART 为串口逻辑协议TTL、RS232、RS485 是不同电气电平标准CH340 模块实现 USB 与 TTL 串口之间的协议转换搭配电平转换芯片可转为 RS232 电平。基础 2. 串口传输文件的实验。将两台笔记本电脑借助 USB/TTL 转 RS232 模块和杜邦线建立起串口连接。然后用串口助手等工具软件如 sscom带文件传输功能将一台笔记本上的一个大文件图片、视频和压缩包软件传输到另外一台电脑。1预估文件大小、波特率和传输时间三者之间的关系并对比实际传输时间。2如果只接 TX–RX、RX–TX 这样两根线不接电源线或者不接 GND 地线文件传输是否还能正常工作请解释原因。解不能正常工作。原因串口是电压相对信号TX 输出的高低电平是相对于 GND 参考地的电压。两个模块不共地时两端参考电位不一致接收端无法正确识别高低电平会出现乱码、接收失败电源线不需要额外接CH340 模块由 USB 供电但是 GND 必须相连。任务一. 安装 STM32CubeMX配合 Keil使用 HAL 库或标准库方式设置 USART1 波特率为 1152001 位停止位无校验位完成下列任务1STM32系统给上位机win10连续发送“hello windows”win10采用“串口助手”工具接收。如果STM32的连续发送之间不加延时语句观察win10端是否出现接收数据丢失的现象。2在完成以上任务基础继续扩展功能当上位机给stm32发送一个字符“#”后stm32暂停发送“hello windows”发送一个字符“*”后stm32继续发送在这里我没有使用 STM32CubeMX我用的正点原子串口调试助手。工程的建立在建立工程时勾选以下选项建立以下几个头文件和源文件在mian.c中写入#includestm32f10x.h#includeusart1.huint8_tsend_enable1;//1允许发送0暂停发送intmain(void){USART1_Init(115200);while(1){if(send_enable1){USART1_SendString((uint8_t*)hello windows!);}}}在usart1.c中写入#includeusart1.hexternuint8_tsend_enable;voidUSART1_Init(uint32_tbaudrate){GPIO_InitTypeDef GPIO_InitStruct;USART_InitTypeDef USART_InitStruct;//开启GPIOA、USART1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);//PA9 TX 复用推挽输出GPIO_InitStruct.GPIO_PinGPIO_Pin_9;GPIO_InitStruct.GPIO_ModeGPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStruct);//PA10 RX 浮空输入GPIO_InitStruct.GPIO_PinGPIO_Pin_10;GPIO_InitStruct.GPIO_ModeGPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,GPIO_InitStruct);//串口参数配置USART_InitStruct.USART_BaudRatebaudrate;USART_InitStruct.USART_WordLengthUSART_WordLength_8b;USART_InitStruct.USART_StopBitsUSART_StopBits_1;USART_InitStruct.USART_ParityUSART_Parity_No;USART_InitStruct.USART_HardwareFlowControlUSART_HardwareFlowControl_None;USART_InitStruct.USART_ModeUSART_Mode_Rx|USART_Mode_Tx;USART_Init(USART1,USART_InitStruct);//开启串口接收中断使能串口USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);USART_Cmd(USART1,ENABLE);//AC6编译器可用的NVIC配置替换掉NVIC_InitNVIC_SetPriority(USART1_IRQn,1);NVIC_EnableIRQ(USART1_IRQn);}//发送单个字符voidUSART1_SendByte(uint8_tdat){USART_SendData(USART1,dat);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)RESET);}//发送字符串voidUSART1_SendString(uint8_t*str){while(*str!\0){USART1_SendByte(*str);str;}}//串口1中断服务函数voidUSART1_IRQHandler(void){uint8_tch;if(USART_GetITStatus(USART1,USART_IT_RXNE)!RESET){chUSART_ReceiveData(USART1);if(ch#){send_enable0;}elseif(ch*){send_enable1;}}}在usart.h中写入#ifndef__USART1_H#define__USART1_H#includestm32f10x.hvoidUSART1_Init(uint32_tbaudrate);voidUSART1_SendByte(uint8_tdat);voidUSART1_SendString(uint8_t*str);#endif在stm32f10x_conf.h中写入#ifndef__STM32F10x_CONF_H#define__STM32F10x_CONF_H#includestm32f10x.h#includestm32f10x_rcc.h#includestm32f10x_gpio.h#includestm32f10x_usart.h#includemisc.h#defineassert_param(expr)((void)0)#endif连线操作USART1 的 TX发送脚向外输出串口数据PA9USART1 的 RX接收脚接收外部数据PA10两者共地3.3v也连一起。电脑将文件下载到芯片内就完成了。结果当上位机给stm32发送一个字符“#”后stm32暂停发送“hello windows”发送一个字符“*”后stm32继续发送任务二. 学习STM32中断、DMA通信原理和编程方法。使用stm32tubemx和HAL库分别完成以下编程练习采用串口中断方式重做上面任务二2的串口通信实验。STM32采用串口DMA方式用115200bps或更高速率向上位机连续发送数据。在main.c中写入#includestm32f10x.h#includeusart1.huint8_tsend_enable1;// 函数声明告诉编译器后面有delay_ms函数voiddelay_ms(uint32_tms);intmain(void){USART1_Init(115200);// 内部会开启USART1发送中断while(1){if(send_enable1){//启动中断方式发送字符串USART1_SendString_IT((uint8_t*)hello windows!\r\n);delay_ms(500);}}}//简易软件毫秒延时voiddelay_ms(uint32_tms){uint32_ti,j;for(i0;ims;i)for(j0;j7200;j);}在usart1.c中写入#includestm32f10x.h#includeusart1.huint8_tsend_enable1;// 函数声明告诉编译器后面有delay_ms函数voiddelay_ms(uint32_tms);intmain(void){USART1_Init(115200);// 内部会开启USART1发送中断while(1){if(send_enable1){//启动中断方式发送字符串USART1_SendString_IT((uint8_t*)hello windows!\r\n);delay_ms(500);}}}//简易软件毫秒延时voiddelay_ms(uint32_tms){uint32_ti,j;for(i0;ims;i)for(j0;j7200;j);}在usart.h中写入#ifndef__USART1_H#define__USART1_H#includestm32f10x.hvoidUSART1_Init(uint32_tbaudrate);voidUSART1_SendByte(uint8_tdat);voidUSART1_SendString(uint8_t*str);voidUSART1_SendString_IT(uint8_t*str);#endif其余配置不变。结果当上位机给stm32发送一个字符“#”后stm32暂停发送“hello windows”发送一个字符“”后stm32继续发送实验总结本次实验学习串口协议、RS232/RS485 与 TTL 电平差异掌握 CH340 USB 转串口模块原理完成 PC 间串口文件传输与 STM32 的 USART 串口编程。PC 串口文件传输中文件大小、波特率决定理论传输时间实际时间因软件开销略长仅交叉 TX/RX 而不接 GND会缺少电位参考基准易出现乱码、传输失败。STM32 配置 USART11152001 停止位无校验轮询不间断发送不加延时会发生数据丢失。通过检测上位机字符#、可实现发送暂停与恢复。相比轮询串口中断方式仅在收到数据时触发节省 CPU 资源DMA 发送无需 CPU 搬运数据适合高速连续大批量数据传输。实验表明串口通信必须收发交叉接线、共地才能稳定工作。轮询、中断、DMA 三种串口方案各有适用场景需根据传输需求合理选择。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询