目录
前言
在嵌入式开发中,为了验证代码逻辑,经常会听到使用串口看一下log;如果在工控类产品时,可能还会听到R232,RS485等串口通信。
开发使用的打印log信息,使用的是3根线(TXD,RXD,GND),这种只有3根线的串口实际上UART(Universal Asynchronous Receiver/Transmitter,通用异步收发)串口通信,与之对应的是USRT(Universal Synchronous Receiver/Transmitter,通用同步收发)串口通信。同步异步的区别在于是否有同步时间信号。而RS232 与RS458等,规定了物理硬件接口与逻辑电平的识别。
UART通信端口参数
UART通信,需要对端口参数设置,下图是UART端口参数,分为四个类。
Speed(比特率):300~230400bps
Parity(奇偶校验):None,Even Odd Mark Space
Data(数据位):5~8 位
Stopbits(停止位):1~2位
微控制器设置UART通信参数,在UART初始化时,对端口参数设置。
Speed(比特率):115200bps
Parity(奇偶校验):None
Data(数据位):8 位
Stopbits(停止位):1位
void MX_USART1_UART_Init(void)
{
/* USER CODE BEGIN USART1_Init 0 */
/* USER CODE END USART1_Init 0 */
/* USER CODE BEGIN USART1_Init 1 */
/* USER CODE END USART1_Init 1 */
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200; //波特率 115200bps
huart1.Init.WordLength = UART_WORDLENGTH_8B; //数据宽度 8bit
huart1.Init.StopBits = UART_STOPBITS_1; //停止位 1 bit
huart1.Init.Parity = UART_PARITY_NONE; //奇偶校验位 0 bit
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART1_Init 2 */
/* USER CODE END USART1_Init 2 */
}
由于UART是异步通信,没有同步时钟,当发送端开始发送数据,需要通知接收端开始接收数据。下图是通过LA(logic analyzer 逻辑分析仪)抓取微控制起向上发送的数据(0x70)的截图。
从下图可以看到
1) 如果没有发送数据,逻辑电平为1;
2) 当需要发送数据时,发送起始位,将电平拉低,逻辑电平为0;
3) 接下来数据位最小为到最高位传输,这是为什么0x70(二进制,b 0111000 ),实际上传输为(b00001110);
4) 数据传输结束,发送停止位,将逻辑电平拉高,逻辑电平为1。
5) 绿色部分是一个bit的脉宽周期大约是8.65us, 1/8.65 = 1000 000/8.65 = 115606 ,与设置的115200基本一致
微控制器与PC的连接
微控制器与PC电平的转换(RS232)
RS232最初的设计是为了使两台计算机设备进行通信,在比较老笔记本电脑或台式机上可以看到9Pin的串口端口。
RS232除了规定端口外,还规定了逻辑电平。
非常有意思的是,在一些文章中提到可能会认为RS232的+5V~+15V为逻辑电平0,-5V~-15V为逻辑电平1;而另外的一些文章文章会认为RS232的+3V~+15V为逻辑电平0,-3V~-15V为逻辑电平1。那么哪一个才是对的呢?逻辑电平应该接收端(输入端)的为准,当电压落在输入的识别电压范围,接收将会识别到逻辑电平。
当微控制器(VDDIO为高电平,为逻辑电平1,VDDIO为低电平,为逻辑电平0)与PC端通过直接连接(+3V~+15V为逻辑电平0,-3V~-15V为逻辑电平1),是不能直接通信的。因为它们的识别逻辑电平的电压不一样。这时可以使用232转换芯片,将微控制器的逻辑电平电压,转为PC端识别的逻辑电平电压,下图是SP232的规格书上对输入输出的标识与实现电路
微控制器电平与USB转串口(虚拟 COM 端口)
随着USB的普及应用,计算机基本已经淘汰DB9端口的。如果还想用DB9,就要找比较古老的电脑才行了或者还有一些工控产品为了稳定性更新迭代满的产品还会用到。
USB转换芯片实际上是将USB数据与微控制器的UART进行转换。常见的芯片CH340,只需要搭载外围电路便可以实现。