GND线是为了统一两设备对高低电平的理解,都是相对于同一个GND而言的。
串口通信是一种设备间常用的串行通信方式,串口通信的协议层中,规定了数据包的内容,它由起始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据。
两设备传输数据过程中0和1两种状态都已被使用,无法确定何时开始或停止接收数据。约定当两设备不需要通讯时,发送端会持续发送高电平,发送端准备发送数据时先发送低电平(图中启动位)告诉接收端接收数据,数据发送完后发送端会发送一个高电平告诉接收端(图中停止位)。但传输的数据中有那么多高电位如何区分停止位,因此需要规定数据的位数(主体数据)。检验位:数据在传输过程中电平可能会被干扰(如高电平1变为低电平0),于是有了以下校验方法:奇检验、偶检验、0 检验、1 检验以及无检验。
奇检验:要求有效数据位和检验位的1总个数为奇数。例:10011001为了达到总个数为奇数校验位需置1.
偶检验:要求有效数据位和校验位的1总个数为偶数。例:10011001为了达到总个数为偶数校验位需置0.
机器只认识0和1,传输数据时会先把数据转化为二进制的0、1。当发送设备发送了连续的0或1时,只以0、1标准识别数据是不行的,这时就需要规定发送和接收每一位数据的时间(下图中每一个1或0的发送和接收时间),不仅可以让数据完整发送出去不会漏掉,也能保证接收准确性,不会错位。
波特率:表示每秒钟传送的码元符号的个数,所以它决定了数据帧里面每一个位的时间长度。两个要通信的设备的波特率一定要设置相同(不会错位)。


随着科技的发展,RS-232
在工业上还有广泛的使用,但是在商业技术上,已经慢慢的使
用
USB
转串口取代了
RS-232
串口。我们只需要在电路中添加一个
USB
转串口芯片,就可以
实现
USB
通信协议和标准
UART
串行通信协议的转换,而我们开发板上的
USB
转串口芯片是
CH340C 这个芯片。STM32
的串口输出的是
TTL
电平信号。



上图从圈1(type-c接口)开始将发送端数据传到圈4,圈5处,才真正将数据传入到接收端。通过PA10把数据发送进MCU,PA9将数据发送进出去。轮循模式下CPU会一直读取TDR和RDR的状态,太占用CPU资源,我们就用中断来提高CPU 的利用率。当TDR或RDR为空时会触发中断把CPU叫回来给TDR、RDR里面放东西。

通用:IO端口的输入或输出是由GPIO外设控制
复用:IO端口的输入或输出是由其它非GPIO外设控制
USART1外设由其自身的DR寄存器控制,我们选用GPIO的复用功能。
要使用一个外设首先要对它进行初始化。
HAL
库通过调用串口初始化函数
HAL_UART_Init
完成对串口参数初始化。 注意:该函数会调用:HAL_UART_MspInit函数来完成对串口底层的初始化(执行回调函数里面的语句),包括:串口及 GPIO时钟使能、GPIO模式设置、中断设置等。
串口
1
中断服务函数为:USART1_IRQHandler,当发生中断的时候,程序就会执行中断服务函 数 。 HAL库为了使用方便提,供了一个串口中断通用处理HAL_UART_IRQHandler,该函数在串口接收完数据后,又会调用回调函数HAL_UART_RxCpltCallback,用于给用户处理串口接收到的数据。我们在回调函数HAL_UART_RxCpltCallback中用uint8_t g_usart1_rx_flag = 1表示串口接收到了数据。还需要通过USART_SR 寄存器第 5、6 位RXNE和TC来获取数据是否被接收或发送到了。