打印
[STM32F4]

stm32f407串口读取stm32f070数据,6小时后数据为恒定值

[复制链接]
640|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 地瓜patch 于 2025-3-20 17:30 编辑

两者通信是应答式
出现该问题后,用另一个模块将接口数据接入pc,数据正确,该数据来自adc,实时变化,说明070发出数据正确。
407将数据做类型强制转换后,发送到pc,数据错误,为一恒定数值不变。
强制类型转换语句如下:
char cdc_rx[2];
float adc_value_float_input[N_INPUT];
float adc_value_float_output[N];
adc_value_float_input[0] = (float)((((uint16_t)cdc_rx[0])<<8)|((uint16_t)cdc_rx[1]));
adc_value_float_output[0] = adc_value_float_input[0];

有时跑十几小时正常,有时六小时出问题

IMG_20250320_173023.jpg (140.25 KB )

IMG_20250320_173023.jpg

使用特权

评论回复
沙发
地瓜patch|  楼主 | 2025-3-25 09:36 | 只看该作者
本帖最后由 地瓜patch 于 2025-4-9 14:10 编辑

@香水城   版主,请教这个问题,是否是hal库存在的问题

终于又出现一次,这次是8小时后。用hal库函数读取串口6的数据
HAL_UART_Receive_IT(&huart6,(uint8_t *)cdc_rx,2);

仿真中cdc_rx[]的值为412,观察寄存器cdc_rx[]的值是0x019C,
观察uart6 DR寄存器0x40011404的值为00,


用串口助手从RS485上读取数据也为00


void MX_USART6_UART_Init(void)
{

  /* USER CODE BEGIN USART6_Init 0 */

  /* USER CODE END USART6_Init 0 */

  /* USER CODE BEGIN USART6_Init 1 */

  /* USER CODE END USART6_Init 1 */
  huart6.Instance = USART6;
  huart6.Init.BaudRate = 115200;
  huart6.Init.WordLength = UART_WORDLENGTH_8B;
  huart6.Init.StopBits = UART_STOPBITS_1;
  huart6.Init.Parity = UART_PARITY_NONE;
  huart6.Init.Mode = UART_MODE_TX_RX;
  huart6.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart6.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart6) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART6_Init 2 */

  /* USER CODE END USART6_Init 2 */

}


else if(uartHandle->Instance==USART6)
  {
  /* USER CODE BEGIN USART6_MspInit 0 */

  /* USER CODE END USART6_MspInit 0 */
    /* USART6 clock enable */
    __HAL_RCC_USART6_CLK_ENABLE();

    __HAL_RCC_GPIOC_CLK_ENABLE();
    /**USART6 GPIO Configuration
    PC6     ------> USART6_TX
    PC7     ------> USART6_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF8_USART6;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    /* USART6 DMA Init */
    /* USART6_RX Init */
    hdma_usart6_rx.Instance = DMA2_Stream1;
    hdma_usart6_rx.Init.Channel = DMA_CHANNEL_5;
    hdma_usart6_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_usart6_rx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_usart6_rx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_usart6_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_usart6_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_usart6_rx.Init.Mode = DMA_NORMAL;
    hdma_usart6_rx.Init.Priority = DMA_PRIORITY_LOW;
    hdma_usart6_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    if (HAL_DMA_Init(&hdma_usart6_rx) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart6_rx);

    /* USART6_TX Init */
    hdma_usart6_tx.Instance = DMA2_Stream6;
    hdma_usart6_tx.Init.Channel = DMA_CHANNEL_5;
    hdma_usart6_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
    hdma_usart6_tx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_usart6_tx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_usart6_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_usart6_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_usart6_tx.Init.Mode = DMA_NORMAL;
    hdma_usart6_tx.Init.Priority = DMA_PRIORITY_LOW;
    hdma_usart6_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    if (HAL_DMA_Init(&hdma_usart6_tx) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart6_tx);

    /* USART6 interrupt Init */
    HAL_NVIC_SetPriority(USART6_IRQn, 5, 0);
    HAL_NVIC_EnableIRQ(USART6_IRQn);
  /* USER CODE BEGIN USART6_MspInit 1 */

  /* USER CODE END USART6_MspInit 1 */
  }




使用特权

评论回复
板凳
stormwind123| | 2025-3-25 10:56 | 只看该作者
STM32F407在接收STM32F070发送的数据后,可能进行了不正确的数据类型转换,导致数据被错误地解释或存储,进而在长时间运行后出现恒定值的现象。

使用特权

评论回复
地板
elephant00| | 2025-3-25 11:05 | 只看该作者
使用示波器检查串口通信波形是否正常。

使用特权

评论回复
5
probedog| | 2025-3-25 12:23 | 只看该作者
可能是串口通信配置不正确。

使用特权

评论回复
6
laocuo1142| | 2025-3-25 13:03 | 只看该作者
串口缓冲区溢出或处理不及时可能导致数据丢失或错误。

使用特权

评论回复
7
flycamelaaa| | 2025-3-25 14:09 | 只看该作者
硬件故障吧。

使用特权

评论回复
8
powerantone| | 2025-3-25 14:20 | 只看该作者
电源不稳定或环境温度变化可能导致STM32的工作异常,进而影响串口通信的稳定性。

使用特权

评论回复
9
stormwind123| | 2025-3-25 15:00 | 只看该作者
STM32F407在接收并处理数据时,可能存在软件逻辑错误,如数据解析错误、变量溢出等,导致数据在长时间运行后出现恒定值。

使用特权

评论回复
10
两只袜子| | 2025-3-25 15:06 | 只看该作者
检查波特率、数据位、停止位、校验位等参数是否一致。

使用特权

评论回复
11
jcky001| | 2025-3-25 16:06 | 只看该作者
优化串口通信处理。

使用特权

评论回复
12
cr315| | 2025-3-25 19:20 | 只看该作者
检查STM32F070和STM32F407的串口引脚连接是否正确。

使用特权

评论回复
13
过期的塔头| | 2025-3-31 23:07 | 只看该作者
数据在STM32F407接收并转换后变得恒定不变,这很可能是由于强制类型转换或者内存访问问题。

使用特权

评论回复
14
丢丢手绢666| | 2025-3-31 23:31 | 只看该作者
可以尝试使用 uint16_t 或 int16_t 来接收数据

使用特权

评论回复
15
香水城| | 2025-4-17 12:37 | 只看该作者
地瓜patch 发表于 2025-3-25 09:36
@香水城   版主,请教这个问题,是否是hal库存在的问题

终于又出现一次,这次是8小时后。用hal库函数读取 ...

我认为是代码处理方面的原因,跟cube库应该没关系。

检查下相关数据处理代码,有无越界或堆栈方面的问题。

使用特权

评论回复
16
地瓜patch|  楼主 | 2025-4-17 15:08 | 只看该作者
laocuo1142 发表于 2025-3-25 13:03
串口缓冲区溢出或处理不及时可能导致数据丢失或错误。

丢失或错误都可以,目前是数据不变了

使用特权

评论回复
17
地瓜patch|  楼主 | 2025-4-17 15:09 | 只看该作者
stormwind123 发表于 2025-3-25 15:00
STM32F407在接收并处理数据时,可能存在软件逻辑错误,如数据解析错误、变量溢出等,导致数据在长时间运行 ...

数值恒定以后,读取的数值,与仿真数据一致。与串口DR数据不一致了

使用特权

评论回复
18
地瓜patch|  楼主 | 2025-4-17 15:11 | 只看该作者
香水城 发表于 2025-4-17 12:37
我认为是代码处理方面的原因,跟cube库应该没关系。

检查下相关数据处理代码,有无越界或堆栈方面的问题 ...

变量仿真时数据与串口DR不一致,请问从哪些方面排查?检测数据线上的数据,与DR数据一致,与变量仿真时数据不一致

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1503

主题

13880

帖子

27

粉丝