本节是介绍如何使用CubeMX配置STM32的串口,并通过轮询的方式实现串口通信,包含发送和接受数据。

    开发环境:CubeMX+MDK5.27
    芯片型号:STM32F103ZET6
    时间:2020/07/11

    轮询方式实现串口通信就是在主函数中不断地查看接收数据是否成功,并做出相应的动作

    实现步骤
    第一步,在CubeMX中配置串口,具体配置见图
    ck.png
    注意NVIC Settings下的USART1 global interrupt是没有使能的

    第二步,编写代码如下

    1. int main(void)
    2. {
    3. /* USER CODE BEGIN 1 */
    4. char str[12] = "Hello World\n";
    5. char Rx_Buff[12] = {0};
    6. /* USER CODE END 1 */
    7. /* MCU Configuration--------------------------------------------------------*/
    8. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    9. HAL_Init();
    10. /* USER CODE BEGIN Init */
    11. /* USER CODE END Init */
    12. /* Configure the system clock */
    13. SystemClock_Config();
    14. /* USER CODE BEGIN SysInit */
    15. /* USER CODE END SysInit */
    16. /* Initialize all configured peripherals */
    17. MX_GPIO_Init();
    18. MX_USART1_UART_Init();
    19. /* USER CODE BEGIN 2 */
    20. HAL_UART_Transmit(&huart1, (uint8_t*)str, 12, 0xFFFF);
    21. /* USER CODE END 2 */
    22. /* Infinite loop */
    23. /* USER CODE BEGIN WHILE */
    24. while (1)
    25. {
    26. /* USER CODE END WHILE */
    27. /* USER CODE BEGIN 3 */
    28. if(HAL_OK == HAL_UART_Receive(&huart1, (uint8_t*)Rx_Buff, 12, 0xFFFF))
    29. {
    30. //将接收到的数据发送
    31. HAL_UART_Transmit(&huart1, (uint8_t*)Rx_Buff, 12, 0xFFFF);
    32. }
    33. }
    34. /* USER CODE END 3 */
    35. }

    我们首先在USER CODE BEGIN1定义了用于发送的字符串str,内容是Hello World,并且定义了一个Rx_Buff保存串口接收到的数据。而在USER CODE BEGIN2下我们调用了HAL_UART_Transmit函数将str字符串发送出去。传入的三个参数分别是串口号,字符串首地址,字符串大小,超时时间。最后我们在USER CODE BEGIN3下编写了一个if条件语句,判断串口是否接收到数据,当接收到数据后,将Rx_Buff中的内容通过HAL_UART_Transmit函数再发出去。也就是说收到的内容会被原封不动的发回去。

    第三部,实验结果
    ck1.png
    总结:最终实验结果可以看出,开发板确实发送了Hello World,而当我们发送了1234567890以及一个换行符时,开发板也将我们发送的内容又重新发给了我们。这样的实现其实是有缺点的,因为它必须要你发送12个位的数据才能够填满Rx_buff,并且把Rx_buff的内容发给你。如果你只发送Hello,他并不会返回一个Hello,直到你把Rx_buff填满,他才会返回Rx_buff里面的内容。