UART,是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),既然是“器”,显然,它就是个设备而已,要完成一个特定的功能的硬件,它本身并不是协议。那么它要完成什么功能呢?它的最基本功能,是串行数据和并行数据之间的转换。我们知道,计算机中的数据以Byte为基本单位,对一个Byte的存取是并行的,即,同时取得/写入8个bit。而串行通信,需要把这个Byte“打碎”,按照时间顺序来收发以实现串行。

RS232/RS485,是两种不同的电气协议,也就是说,是对电气特性以及物理特性的规定,作用于数据的传输通路上,它并不内含对数据的处理方式。比如,最显著的特征是:RS232使用3-15v有效电平,而UART,因为对电气特性并没有规定,所以直接使用CPU使用的电平,就是所谓的TTL电平(可能在0~3.3V之间)。更具体的,电气的特性也决定了线路的连接方式,比如RS232,规定用电平表示数据,因此线路就是单线路的,用两根线才能达到全双工的目的;而RS485, 使用差分电平表示数据,因此,必须用两根线才能达到传输数据的基本要求,要实现全双工,必需用4根线。但是,无论使用RS232还是RS485,它们与UART是相对独立的,但是由于电气特性的差别,必须要有专用的器件和UART接驳,才能完成数据在线路和UART之间的正常流动。

普通方式的串口

  /* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if(HAL_UART_Receive(&huart1, &c, sizeof(c), 1000) == HAL_OK){if(c == '\r'){HAL_UART_Transmit(&huart1, (uint8_t*)"\n", sizeof("\n"), 1000);}HAL_UART_Transmit(&huart1, &c, sizeof(c), 1000);}}/* USER CODE END 3 */

串口使用printf()

#include <stdio.h>
#ifdef __GNUC__
int __io_putchar(int ch)
{HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 100);if(ch == '\n')HAL_UART_Transmit(&huart1, (uint8_t*)"\r", 2, 100);return ch;
}
#endif

中断方式UART

先在主函数中初始调用一次中断接收

  /* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */HAL_UART_Receive_IT(&huart1, &c, sizeof(c));/* USER CODE END 2 */

注册接收完成的回调函数,这个函数是弱函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart == &huart1){if(c == '\r'){HAL_UART_Transmit_IT(huart, (uint8_t*)"\n\r", sizeof("\n\r"));}else{HAL_UART_Transmit_IT(huart, &c, sizeof(c));}}HAL_UART_Receive_IT(huart, &c, sizeof(c));
}

HAL_UART_Transmit_IT只发送一次数据,下次发送需要等待下次中断

 //第二行代码不会生效,只会发送"ab",而不会发生"abcde",或者被覆盖成"cde"//这与中断的结构有关HAL_UART_Transmit_IT(huart, (uint8_t*)"ab", sizeof("ab"));HAL_UART_Transmit_IT(huart, (uint8_t*)"abc", sizeof("abc"));

DMA串口

以USART1为例
MX配置完DMA通道的代码

static void MX_DMA_Init(void)
{/* DMA controller clock enable */__HAL_RCC_DMA2_CLK_ENABLE();/* DMA interrupt init *//* DMA2_Stream2_IRQn interrupt configuration */HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 0, 0);HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);/* DMA2_Stream7_IRQn interrupt configuration */HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 0, 0);HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn);}
HAL_UART_Transmit_DMA(&huart1, buffer, sizeof(buffer));

STM32之UART相关推荐

  1. 用STM32的UART实现DMX512

    用STM32的UART实现DMX512 2018.09.12 17:26:43 字数 701 阅读 1199 写在最前面: DMX512(digital multiplex) 其实就是主机向从机整包单 ...

  2. stm32串口接收不定长数据_基于STM32之UART串口通信协议--接收

    一.前言 1.简介 回顾上一篇UART发送当中,已经讲解了如何实现UART的发送操作了,接下来这一篇将会继续讲解如何实现UART的接收操作. 2.UART简介 嵌入式开发中,UART串口通信协议是我们 ...

  3. STM32开发 -- UART应用层通信协议分析

    拿到一份UART的通信协议,上手来操作之前先做一下分析. 一.帧格式说明 先看一下它的帧格式说明: 1. 帧头标志Head 不论是命令帧还是响应帧,帧头标志都是0x92. 2. 协议版本 协议版本号( ...

  4. stm32中UART和USART的区别

    UART,全称为universal asynchronous receiver and transmitter,即通用异步收/发器: USART,全称为universal synchronous as ...

  5. 【RT-Thread】STM32的UART设备读取GPS数据

    目录 前言 1. 开发环境搭建 2. RTT Studio创建工程 3. CubeMX配置系统时钟 4. SConscript构建目录 5. UART设备驱动程序 6. 获取GPS定位信息 小结 前言 ...

  6. STM32学习——UART串口通信学习

    1.UART简介 UART(Universal Asyvhronous Receiver Transmitter)统称为通用异步收发器,是一种通用的串行.异步通信总线,有两条数据线,可以实现全双工的发 ...

  7. STM32 UART DMA实现未知数据长度接收(转自amoBBs)

    串口通信是经常使用到的功能,在STM32中UART具有DMA功能,并且收发都可以使用DMA,使用DMA发送基本上大家不会遇到什么问题,因为发送的时候会告知DMA发送的数据长度,DMA按照发送的长度直接 ...

  8. STM32从零到一,从标准库移植到HAL库,UART串口1以DMA模式收发不定长数据代码详解+常见问题 一文解析

    前言 本文的参考资料 感谢提供标准库版本的CSDN同学:这两篇文章至少是我看过的最详细的标准库配置DMA版本.而且代码实测稳定能用. STM32 | DMA配置和使用如此简单(超详细)_...| .. ...

  9. 用STM32 USB虚拟串口替代UART

    本文使用的库为 stsw_stm32121_V4.1.0,在STM32F103C8 上开发. 导入: 最近玩STM32时深感UART不方便,得用杜邦线把STM32和UART转USB模块连起来,于是了解 ...

最新文章

  1. C++ 多继承和虚继承的内存布局
  2. 我的同事Leo做的一个AR增强现实的项目
  3. faster-rcnn tensorflow windows python 训练自己数据
  4. php位值,解决 PHP 中 usort 在值相同时改变原始位置的问题
  5. node函数 python_成为Python大牛必须要掌握的高端语法(附链接代码)
  6. SQL Server启动的几种方法
  7. 实时控制软件第二次作业
  8. centos7配置php-fpm,centos7 配置php-fpm
  9. 视频教程-思科CCNP专题系列⑤:路由策略路由-思科认证
  10. 使用SpringMVC框架实现员工管理系统
  11. mscorsvw.exe是windows的什么进程!!
  12. acml会议级别_人工智能领域的顶级学术会议大全(二)
  13. 《数独游戏的设计与实现》
  14. android 如何刷机,安卓怎么刷机_安卓刷机图解_刷机大师教程
  15. Win7 IE11、Flash插件、.NET Framework组件 安装教程
  16. 上、下运动神经元的区别
  17. 影评(一):《寄生虫》韩国(2019)
  18. ios开发如何给程序添加icon图标
  19. SQL Server 2008存储结构——GAM和SGAM、PFS结构、IAM结构、DCMBCM
  20. java 液晶屏数字_java实现液晶数字字体显示当前时间

热门文章

  1. 关于硬件工程师的真相:敢问路在何方?
  2. nginx的配置文件详解
  3. 产品开发必看!一篇讲透,京东商城双轮驱动的核心业务模式!
  4. jam stack_纯JAM堆栈
  5. ArcGIS 栅格计算器con()函数用法
  6. 2021年小红书品牌经典爆文拆解
  7. mysql中information_schema.columns字段说明
  8. word2000来处理图象(转)
  9. Mac电脑环境变量设置方法及常见环境变量说明
  10. 整行读入,空格分割;数字与字符串混合读入;String转int