c
void MX_USART1_UART_Init(void)
{
/* USER CODE BEGIN USART1_Init 0 */
/* USER CODE END USART1_Init 0 */
/* USER CODE BEGIN USART1_Init 1 */
/* USER CODE END USART1_Init 1 */
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
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;
huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART1_Init 2 */
// 关键:检查中断是否真正使能(H7 必须包含以下两行)
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE); // 使能接收中断标志
HAL_NVIC_SetPriority(USART1_IRQn, 5, 0); // 设置优先级(H7 优先级分组需匹配)
HAL_NVIC_EnableIRQ(USART1_IRQn); // 使能 NVIC 中断
/* USER CODE END USART1_Init 2 */
}
main 初始化
c
rxIndex=0;
HAL_UART_Receive_IT(&huart1, &rxBuffer[0], 1);
中断函数
c
#define RX_BUFFER_SIZE 10
uint8_t rxBuffer[RX_BUFFER_SIZE];
uint8_t rxIndex = 0;
double receivedValue = 0.0;
volatile uint8_t messageReceived = 0; // 新增:消息完成标志
uint32_t usartCHUBA=0;
if (huart->Instance == USART1) {
// ✅ 关键修复:先保存刚收到的字节,再更新索引
rxBuffer[rxIndex]=(rxBuffer[rxIndex]&0X7F);
//if(rxIndex<7){usartCHUBA=(usartCHUBA << 8) | rxBuffer[rxIndex];}
uint8_t receivedByte = rxBuffer[rxIndex]; // 1. 立即复制刚收到的字节
// 原样回显(确保使用复制的值,而非可能被覆盖的缓冲区)
HAL_UART_Transmit(&huart1, &receivedByte, 1, HAL_MAX_DELAY);
if(rxIndex<(RX_BUFFER_SIZE-1))
{
rxIndex++;
}else{rxIndex=0;}
// 保持接收中断开启(始终指向当前有效索引)
HAL_UART_Receive_IT(&huart1, &rxBuffer[rxIndex], 1);
}