Преглед на файлове

掌握串口收发底层原理。

xuxinyi преди 3 месеца
родител
ревизия
c01b9907ae
променени са 2 файла, в които са добавени 30 реда и са изтрити 10 реда
  1. 25 9
      Core/Src/main.c
  2. 5 1
      问题记录/问题笔记.md

+ 25 - 9
Core/Src/main.c

@@ -19,6 +19,7 @@
 /* Includes ------------------------------------------------------------------*/
 #include "main.h"
 #include "cmsis_os.h"
+#include "string.h"
 
 /* Private includes ----------------------------------------------------------*/
 /* USER CODE BEGIN Includes */
@@ -372,6 +373,8 @@ static void MX_GPIO_Init(void)
 /* USER CODE END Header_StartDefaultTask */
 // 全局变量用于存储接收的数据和状态
 uint8_t rx_buffer;
+uint8_t total[50] = {'\0'} ;
+uint8_t rx_index = 0;
 uint8_t rx_complete_flag = 0;
 
 // 串口中断回调函数
@@ -381,7 +384,7 @@ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
   {
     // 接收完成,设置标志位
     rx_complete_flag = 1;
-
+    total[rx_index++] = rx_buffer;
     // 重新开启中断接收,准备接收下一个字节
     HAL_UART_Receive_IT(&huart2, &rx_buffer, 1);
   }
@@ -390,18 +393,18 @@ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
 void StartDefaultTask(void *argument)
 {
   /* USER CODE BEGIN 5 */
-  // 初始化时开启中断接收
+  // 初始化时开启中断接收,接收10字节
   HAL_UART_Receive_IT(&huart2, &rx_buffer, 1);
 
   /* Infinite loop */
   for(;;)
   {
-    // 发送字符串到UART2
+    // 用 printf 输出(printf 已经重定向到 USART2)
     printf("hello world task 1\r\n");
 
-    // 发送一个换行符(0x0a)到UART2
-    uint8_t c = 0x0a;
-    HAL_UART_Transmit(&huart2, &c, 1, HAL_MAX_DELAY);
+    // 发送一个字符串到UART2
+    const char *msg = "12345hhl7890";
+    HAL_UART_Transmit(&huart2, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY);
 
     // 检查是否有数据接收完成
     if (rx_complete_flag)
@@ -409,10 +412,23 @@ void StartDefaultTask(void *argument)
       // 清除标志位
       rx_complete_flag = 0;
 
-      // 处理接收到的数据
-      printf("Received data: %02x\r\n", rx_buffer);
+      // 打印接收到的数据(以字符串形式)
+      // rx_buffer[13] = '\0';  // 确保结尾安全
+      // printf("Received data: %s\r\n", rx_buffer);
+
+      // 或者打印为 hex
+      /*
+      for (int i = 0; i < sizeof(rx_buffer); i++) {
+          printf("%02x ", rx_buffer[i]);
+      }
+      printf("\r\n");
+      */
     }
-
+    printf("Received data: %s\r\n", total);
+    osDelay(500);
+    memset(total, '\0', 50);
+    rx_index = 0;
+    printf("111");
     // 延时1秒
     osDelay(1000);
   }

+ 5 - 1
问题记录/问题笔记.md

@@ -1,2 +1,6 @@
 1. stm32f103c8t6串口打印异常:
-    不能同时debug,和打印串口。估计是运行内存不够。
+    不能同时debug,和打印串口。估计是运行内存不够。
+2. 串口接收的坑:
+   HAL_UART_Receive_IT(&huart2, &rx_buffer, 20);
+    这里如果串口约定了20字节,那么触发这个回调的条件之一就是,串口接收到20字节。如果发生的字节数不够,那么不会触发,等待你下一次发生
+    数据。直到接收到20个字节,才会触发。会导致混乱。所以改成单字节获取。这样就可以接收不定长串口的数据了。