COM口
串行接口简称串口(COM口),使用USART/UART协议,单片机中兼容TTL电平和CMOS电平,意思就是多高电压是1,多低电压是0
代码实现
在main函数之前先定义
uint8_t str[100] = "test string";
//回调函数,触发中断后执行的程序
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
/* Prevent unused argument(s) compilation warning */
HAL_UART_Transmit_IT(&huart1, str, Size);
HAL_UARTEx_ReceiveToIdle_IT(&huart1, str, 100);
/* NOTE : This function should not be modified, when the callback is needed,
the HAL_UARTEx_RxEventCallback can be implemented in the user file.
*/
}
让我感到疑惑的是在发送函数里的长度是Size,而接收函数里却是100,询问deepseek得知
HAL_UART_Transmit_IT(&huart1, str, Size);
-
Size:这个参数表示要发送的数据长度。在
HAL_UARTEx_RxEventCallback
回调函数中,Size
是由 UART 接收事件触发时传入的,表示实际接收到的数据长度。因此,发送数据时使用Size
作为长度参数,确保只发送实际接收到的数据,而不是整个缓冲区的内容。
HAL_UARTEx_ReceiveToIdle_IT(&huart1, str, 100);
-
100:这个参数表示接收缓冲区的最大长度。
HAL_UARTEx_ReceiveToIdle_IT
函数用于启动 UART 接收,直到接收到指定数量的数据或检测到空闲线路(idle line)事件。这里的100
是接收缓冲区的最大容量,表示最多可以接收 100 个字节的数据。
在UART发送或接收数据函数的定义里可以看到
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
数据的类型格式是uint8_t,所以在定义字符串数组的时候用uint8_t,说明这里是字节数据而非字符。
最后在main函数里加入一句代码
HAL_UARTEx_ReceiveToIdle_IT(&huart1, str, 100);
HAL_UARTEx_ReceiveToIdle_IT
是一个用于启动 UART 接收的函数,它会在接收到指定数量的数据或检测到空闲线路(idle line)事件时触发回调函数。
否则回调函数检测不到空闲线路或者数据,当数据接收完成就无法处理这些数据。
触发回调函数的目的是通知应用程序:当前帧的数据已经接收完成,可以处理这些数据了。