STM32串口中断接收

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);
        
    }
相关推荐
wuyk5553 小时前
4.树:一对多的层次数据结构
开发语言·数据结构·stm32·单片机
天空'之城5 小时前
单片机基础核心知识点汇总(五)
单片机·嵌入式硬件
恒锐丰-罗生10 小时前
SS8103 芯片解析:45V 同步整流降压半桥恒流驱动控制器 大功率光源国产优选 告别低灰闪烁!
驱动开发·嵌入式硬件·硬件工程
FakeOccupational11 小时前
【电路笔记 STM32】stm32f103 实现HAL_UART_Transmit_DMA + 普通模式/连续模式的 UART DMA 收发
笔记·stm32·嵌入式硬件
wuyk55511 小时前
第 6 章 FOC 完整系统整合:从算法到真机跑起来
c语言·开发语言·stm32·单片机·嵌入式硬件
恒锐丰科技韩生12 小时前
率能 SS6810H|10‑32V 双通道 H 桥步进电机驱动 ETSSOP20 打印机安防舞台灯光专用
嵌入式硬件·硬件工程
1560820721912 小时前
直流耦合采集卡前端电路调试
嵌入式硬件·fpga开发
恒锐丰科技林技术员13 小时前
SS6841T 双通道 H 桥驱动芯片:大电流集成电机驱动优选方案
单片机·嵌入式硬件
打工陈13 小时前
器件知识——(1)磁珠与电感
嵌入式硬件·智能硬件·设计规范
LCG元13 小时前
STM32 HAL 库串口 DMA + 空闲中断接收不定长数据:从原理到排查“上电误进 IDLE“
stm32·单片机·嵌入式硬件