引言: 需要使用到的uart调试工具在文章最后的资料里面
题外话:uart和usart的区别
UART(Universal Asynchronous Receiver/Transmitter)和USART(Universal Synchronous/Asynchronous Receiver/Transmitter)都是串行通信接口,用于将数据以串行方式发送和接收。
它们之间的区别如下:
1. 同步通信支持:USART支持同步通信,可以通过在时钟信号的同步下进行数据传输。而UART只支持异步通信,数据的传输不需要时钟信号的同步。
2. 传输速率:由于支持同步通信,USART通常可以实现比UART更高的传输速率。它可以通过调整时钟信号的频率来支持不同的传输速率。而UART的传输速率通常较低。
3. 数据格式:UART和USART的数据格式在异步通信时一致,都可以支持不同的数据位、校验位和停止位等设置。但在同步通信时,USART还需要设置数据位的同步配置。
4. 错误检测:USART通常支持多种错误检测机制,如奇偶校验、校验和等。而UART通常只支持奇偶校验。
5. 数据帧缓冲区:USART通常具有数据帧缓冲区,可以在数据接收过程中暂存多个数据帧。而UART通常只有一个单一的数据接收缓冲区。
总之,UART和USART都是常见的串行通信接口,根据具体的应用需求选择合适的接口。如果需要更高的速率、同步通信和更多的错误检测机制,可以选择USART。如果只需要简单的异步通信,UART就可以满足需求。
一、UART的相关知识
1. 通信相关知识的基本介绍
- 通信的基本概念
在单片机的应用中,数据的通信是必不可少的一部分。比如:单片机和上位机、单片机和外围器件之间,它们都有数据通信的需求。由于设备之间的电气特性、传输速率、可靠性要求各不相同,于是就有了各种通信类型、通信协议。我们最常见的有:UART、IIC、SPI、CAN、USB 等。常见的数据通信都具有这四种概念,分别是:数据通信方式、数据传输方向、数据同步方式、通信速率。
这么来说吧, 大家思考一下这个问题, 编程的两个大核心是什么?是不是就是算法和数据, 而在单片机或者说是物联网的开发场景中获取到数据常常需要使用到这些通信协议, 拿到单片机外围设备中的各种数据信息, 在转交给CPU按照程序员需要的业务逻辑进行处理。
- 数据通信方式
按数据通信方式分类,可分为串行通信和并行通信两种
所谓的串行通信就是数据按照二进制位一位一位的处理, 而并行通信是指, 这里举个例子,假设由一个字节的数据等待发送出去, 一个字节也就是八位,看到上图就是将一个数据的八位通过八根导线一次性将八位数据一次性发送出去。
- 数据传输方向
根据数据传输方向,通信又可分为全双工、半双工和单工通信。
- 数据同步方式
这里所谓的数据的同步方式本质就是收发双方有没有使用同一个时钟, 比如uart收发双方都是使用各自的时钟这种就是异步的, 为了不让数据产生太大的误差, uart都是一个字节一个字节的发送的, 后面会在讲uart的具体通信的时序图。
- 通信速率
在数字通信系统中,通信速率(传输速率)指数据在信道中传输的速度,它分为两种:传信率和传码率。
传信率(Rb):每秒钟传输的信息量,即每秒钟传输的二进制位数,通常用 Rb 表示,单位为 bit/s(即比特每秒),因而又称为比特率。
传码率(RB):每秒钟传输的码元个数,通常用 RB 表示,单位为 Bd 或 Baud(即波特每秒),因而又称为波特率。
2. UART的时序图
Universal Asynchronous Receiver Transmitter 即通用异步收发器,是一种通用的串行、异步通信总线 , 该总线有两条数据线,可以实现全双工的发送和接收 在嵌入式系统中常用于主机与辅助设备之间的通信
串口的实物图
大家别惊讶, 标准的uart协议采取的是TTL电平进行数据传输, 传输距离短, 干扰大,所有在此基础上在标准的uart的协议上在其硬件特性上增加了很多硬件特性, 采用差分信号进行传输, 大大提高高传输距离。这些我们做一下了解就行, 因为软件对uart的操作没变化。
二、实验开始
1. 分析原理图
大家找到自己实验平台的uart的引脚, 接着老套路, 配置引脚为uart模式。
2. 引脚配置
配置为uart收发模式
接着设置uart的模式修改为异步模式, 其它的就不用修改了, 波特率那里也可以改, 打死但是记得使用串口调试软件的时候软甲的波特率记得修改成和这里的一样, 不然会出现乱码。
3. 代码编写
这里我就将使用到uart中的函数主要的部分拿过来, 很简单的, 大家自己的实验的时候可以自己编写规范一些, 将代码写成工程代码的那种样式。
/*printf函数的输出重定向*/
int __io_putchar(int ch)
{HAL_UART_Transmit(&huart4,(uint8_t*)&ch,1,HAL_MAX_DELAY);return ch;
}HAL_UART_Receive(&huart4, (uint8_t *)buffer, strlen((const char *)buffer)-1, 100);
HAL_UART_Transmit(&huart4, (uint8_t *)buffer, strlen((const char *)buffer), 100);
memset(buffer, 0, strlen((const char *)buffer));
printf("Hello World\n");
HAL_Delay(500);
__io_putchar函数在工程中写上之后,当我们再使用printf函数的时候单片机就会把数据通过巉口发送给我们的电脑。为什么发送给电脑, 因为咱们的单片机没有屏幕呀。
这样之后我们在做各种项目和实验的时候就可以使用printf函数来对代码进行分析调试了。
三、资料提供
链接:https://pan.baidu.com/s/1WfDXoHmvgLQEpHfbQx0zBg
提取码:1234