STM32F1 在 USART 上接收重复的第一个字节的问题

Posted

技术标签:

【中文标题】STM32F1 在 USART 上接收重复的第一个字节的问题【英文标题】:STM32F1 problem receiving duplicated first byte on USART 【发布时间】:2022-01-05 06:00:30 【问题描述】:

我使用 UART 发送和接收数据的 STM23F103 有问题。数据已发送,另一块板回复。我可以看到与逻辑分析仪的通信,它看起来很好。但是 STM32 上接收到的数据的第一个字节来自数据包发送的第一个字节或最后一个接收到的数据包的最后一个字节。我不知道是什么我的代码有问题,但我不知道如何解决问题

这是main中的代码

uint8_t b[5] = 0xAA,0xBB,0xCC,0xDD,0xEE;
HAL_UART_Transmit(&huart3,b, sizeof(b), 100);
uint8_t r[5]=0,0,0,0,0;
HAL_UART_Receive(&huart3, r, sizeof(r), 100); 
HAL_Delay(100);
uint8_t d[5] = 0x11,0x22,0x33,0x44,0x55;
HAL_UART_Transmit(&huart3,d, sizeof(d), 100);
uint8_t r2[5]=0,0,0,0,0;
HAL_UART_Receive(&huart3, r2, sizeof(r2), 100);
HAL_Delay(100);

这里是初始化

static void MX_USART1_UART_Init(void)

  huart1.Instance = USART1;
  huart1.Init.BaudRate = 10400;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  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();
  

逻辑分析仪上出现的数据包是 0xA1,B2,C3,D4,E5 但在 STM32 上它接收到 AA,A1,B2,C3,D4 第一个字节始终与我发送的数据包相同。但仅限于第一个数据包。

在其他数据包上收到这样的 0xE5,66,77,88,99 而它应该是 66,77,88,99,AA 但我从最后收到的数据包中得到 E5。我认为该数据包尚未收到,因此我认为通过将 r 和 r2 的大小从 5 增加到 6 可以解决问题,但事实并非如此。我收到 AA,A1,B2,C3,D4,E5 用于 r 和 0xE5,66,77,88,99,AA 用于 r2。

我希望它足够详细以查看问题。

我正在使用 STM32CubeIDE

【问题讨论】:

【参考方案1】:

听起来这可能是设置问题,因为您的代码看起来不错。

首先我会仔细检查 UART_Init() 中的 UART 属性。确保它们对于发送者和接收者都是相同的(波特率、奇偶校验等)。 您的逻辑分析仪还需要知道正确的 UART 属性。

发布一个指向您的代码的链接,我可能会为您提供进一步的帮助。

【讨论】:

请看帖子我已经添加了init方法我不认为Init有问题。我使用STM32Cube生成项目,我没有编辑除波特率之外的任何内容到 10400,这也在逻辑分析仪中进行了编辑。另外,如果我使用 arduino 板来完成发送请求的这一部分,它会毫无问题地完成,并且我会按预期接收数据包。但我需要改用 STM32 你已经发布了你的 UART1 初始化。您的主代码使用 UART3 句柄 (huart3)。

以上是关于STM32F1 在 USART 上接收重复的第一个字节的问题的主要内容,如果未能解决你的问题,请参考以下文章

STM32F103(二十五)完美解决USART发送接收floatu16u32数据

16 . USART 串口通信实验

16 . USART 串口通信实验

16 . USART 串口通信实验

STM32F103(二十五)完美解决USART发送接收floatu16u32数据

STM32F1上CAN2不能接收到数据