stm32f407串口读取stm32f070数据,6小时后数据为恒定值
本帖最后由 地瓜patch 于 2025-3-20 17:30 编辑两者通信是应答式
出现该问题后,用另一个模块将接口数据接入pc,数据正确,该数据来自adc,实时变化,说明070发出数据正确。
407将数据做类型强制转换后,发送到pc,数据错误,为一恒定数值不变。
强制类型转换语句如下:
char cdc_rx;
float adc_value_float_input;
float adc_value_float_output;
adc_value_float_input = (float)((((uint16_t)cdc_rx)<<8)|((uint16_t)cdc_rx));
adc_value_float_output = adc_value_float_input;
有时跑十几小时正常,有时六小时出问题
本帖最后由 地瓜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 */
}
STM32F407在接收STM32F070发送的数据后,可能进行了不正确的数据类型转换,导致数据被错误地解释或存储,进而在长时间运行后出现恒定值的现象。 使用示波器检查串口通信波形是否正常。 可能是串口通信配置不正确。 串口缓冲区溢出或处理不及时可能导致数据丢失或错误。 硬件故障吧。 电源不稳定或环境温度变化可能导致STM32的工作异常,进而影响串口通信的稳定性。 STM32F407在接收并处理数据时,可能存在软件逻辑错误,如数据解析错误、变量溢出等,导致数据在长时间运行后出现恒定值。 检查波特率、数据位、停止位、校验位等参数是否一致。
优化串口通信处理。 检查STM32F070和STM32F407的串口引脚连接是否正确。 数据在STM32F407接收并转换后变得恒定不变,这很可能是由于强制类型转换或者内存访问问题。 可以尝试使用 uint16_t 或 int16_t 来接收数据 地瓜patch 发表于 2025-3-25 09:36
@香水城 版主,请教这个问题,是否是hal库存在的问题
终于又出现一次,这次是8小时后。用hal库函数读取 ...
我认为是代码处理方面的原因,跟cube库应该没关系。
检查下相关数据处理代码,有无越界或堆栈方面的问题。 laocuo1142 发表于 2025-3-25 13:03
串口缓冲区溢出或处理不及时可能导致数据丢失或错误。
丢失或错误都可以,目前是数据不变了 stormwind123 发表于 2025-3-25 15:00
STM32F407在接收并处理数据时,可能存在软件逻辑错误,如数据解析错误、变量溢出等,导致数据在长时间运行 ...
数值恒定以后,读取的数值,与仿真数据一致。与串口DR数据不一致了 香水城 发表于 2025-4-17 12:37
我认为是代码处理方面的原因,跟cube库应该没关系。
检查下相关数据处理代码,有无越界或堆栈方面的问题 ...
变量仿真时数据与串口DR不一致,请问从哪些方面排查?检测数据线上的数据,与DR数据一致,与变量仿真时数据不一致
页:
[1]