【个人纪录】STM32G431RBT6 USART/UART

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)事件时触发回调函数。

否则回调函数检测不到空闲线路或者数据,当数据接收完成就无法处理这些数据。

触发回调函数的目的是通知应用程序:当前帧的数据已经接收完成,可以处理这些数据了

STM32G431RBT6 微控制器中实现 UART 通信功能,通常涉及配置 GPIO 引脚、设置 UART 模式(如异步模式)、配置波特率、数据位、停止位和校验方式等。以下是一个基于 STM32 HAL 库的 UART 初始化和数据收发示例。 ### UART 初始化配置 在初始化 UART 之前,需要确保以下配置步骤: 1. **GPIO 配置**:将 UART 的 TX 和 RX 引脚配置为复用推挽模式。 2. **UART 参数设置**:包括波特率、数据位长度、停止位、校验方式等。 3. **中断或 DMA 配置**(可选):用于非阻塞式数据传输。 以下是一个 UART 初始化的代码示例: ```c UART_HandleTypeDef huart2; void MX_USART2_UART_Init(void) { huart2.Instance = USART2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart2) != HAL_OK) { // 初始化错误处理 Error_Handler(); } } ``` ### UART 数据发送 使用 HAL_UART_Transmit 函数可以发送数据。以下是一个发送字符串的示例: ```c char *msg = "Hello, UART!\r\n"; HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY); ``` ### UART 数据接收 可以使用阻塞或非阻塞方式接收数据。以下是一个使用阻塞方式接收数据的示例: ```c uint8_t rx_data[100]; HAL_UART_Receive(&huart2, rx_data, sizeof(rx_data), HAL_MAX_DELAY); ``` ### 完整代码结构 通常,完整的 UART 示例代码包括时钟配置、GPIO 初始化、UART 初始化以及主函数中的数据收发逻辑。以下是一个简化的主函数示例: ```c int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART2_UART_Init(); char *startup_msg = "UART Communication Started\r\n"; HAL_UART_Transmit(&huart2, (uint8_t*)startup_msg, strlen(startup_msg), HAL_MAX_DELAY); while (1) { // 可以在此循环中添加其他逻辑 } } ``` ### 注意事项 - **引脚配置**:确保使用正确的 UART 引脚并配置为复用模式。 - **波特率**:根据通信设备的设置调整波特率。 - **缓冲区大小**:接收缓冲区大小应根据预期的数据量进行调整。 - **错误处理**:在实际应用中,建议添加适当的错误处理机制。 ### 相关问题 1. 如何在 STM32G431RBT6 上使用中断方式实现 UART 接收? 2. 如何配置 STM32G431RBT6UART 使用 DMA 进行高效数据传输? 3. 在 STM32G431RBT6 上,如何通过 UART 接收不定长数据? 4. 如何在 STM32CubeMX 中配置 UART 通信参数? 5. STM32G431RBT6UART 支持哪些硬件流控制选项?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值