STM32之UART
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相关推荐
- 用STM32的UART实现DMX512
用STM32的UART实现DMX512 2018.09.12 17:26:43 字数 701 阅读 1199 写在最前面: DMX512(digital multiplex) 其实就是主机向从机整包单 ...
- stm32串口接收不定长数据_基于STM32之UART串口通信协议--接收
一.前言 1.简介 回顾上一篇UART发送当中,已经讲解了如何实现UART的发送操作了,接下来这一篇将会继续讲解如何实现UART的接收操作. 2.UART简介 嵌入式开发中,UART串口通信协议是我们 ...
- STM32开发 -- UART应用层通信协议分析
拿到一份UART的通信协议,上手来操作之前先做一下分析. 一.帧格式说明 先看一下它的帧格式说明: 1. 帧头标志Head 不论是命令帧还是响应帧,帧头标志都是0x92. 2. 协议版本 协议版本号( ...
- stm32中UART和USART的区别
UART,全称为universal asynchronous receiver and transmitter,即通用异步收/发器: USART,全称为universal synchronous as ...
- 【RT-Thread】STM32的UART设备读取GPS数据
目录 前言 1. 开发环境搭建 2. RTT Studio创建工程 3. CubeMX配置系统时钟 4. SConscript构建目录 5. UART设备驱动程序 6. 获取GPS定位信息 小结 前言 ...
- STM32学习——UART串口通信学习
1.UART简介 UART(Universal Asyvhronous Receiver Transmitter)统称为通用异步收发器,是一种通用的串行.异步通信总线,有两条数据线,可以实现全双工的发 ...
- STM32 UART DMA实现未知数据长度接收(转自amoBBs)
串口通信是经常使用到的功能,在STM32中UART具有DMA功能,并且收发都可以使用DMA,使用DMA发送基本上大家不会遇到什么问题,因为发送的时候会告知DMA发送的数据长度,DMA按照发送的长度直接 ...
- STM32从零到一,从标准库移植到HAL库,UART串口1以DMA模式收发不定长数据代码详解+常见问题 一文解析
前言 本文的参考资料 感谢提供标准库版本的CSDN同学:这两篇文章至少是我看过的最详细的标准库配置DMA版本.而且代码实测稳定能用. STM32 | DMA配置和使用如此简单(超详细)_...| .. ...
- 用STM32 USB虚拟串口替代UART
本文使用的库为 stsw_stm32121_V4.1.0,在STM32F103C8 上开发. 导入: 最近玩STM32时深感UART不方便,得用杜邦线把STM32和UART转USB模块连起来,于是了解 ...
最新文章
- C++ 多继承和虚继承的内存布局
- 我的同事Leo做的一个AR增强现实的项目
- faster-rcnn tensorflow windows python 训练自己数据
- php位值,解决 PHP 中 usort 在值相同时改变原始位置的问题
- node函数 python_成为Python大牛必须要掌握的高端语法(附链接代码)
- SQL Server启动的几种方法
- 实时控制软件第二次作业
- centos7配置php-fpm,centos7 配置php-fpm
- 视频教程-思科CCNP专题系列⑤:路由策略路由-思科认证
- 使用SpringMVC框架实现员工管理系统
- mscorsvw.exe是windows的什么进程!!
- acml会议级别_人工智能领域的顶级学术会议大全(二)
- 《数独游戏的设计与实现》
- android 如何刷机,安卓怎么刷机_安卓刷机图解_刷机大师教程
- Win7 IE11、Flash插件、.NET Framework组件 安装教程
- 上、下运动神经元的区别
- 影评(一):《寄生虫》韩国(2019)
- ios开发如何给程序添加icon图标
- SQL Server 2008存储结构——GAM和SGAM、PFS结构、IAM结构、DCMBCM
- java 液晶屏数字_java实现液晶数字字体显示当前时间