STM32串口中断接收实验(HAL库)

工具:

单片机:STM32L053R8T6(NUCLEO板)

STM32cube

简介:STM32与上位机之间用通信协议(自己定义)进行串口通信。怎么判断上位机发过来的指令是正确的,而不是一串乱码?怎么从正确的指令中提取出想要的命令代号,从而实现想要的功能?

方法:读取上位机发来的命令,逐位判断命令的包头和包尾,如果能对应上,则这串指令是正确的,然后从指令中提取想要的数据和命令等。举个栗子:通信协议是自己定义的,不是modbus协议等。。如F0 5A 15 15 25 16 09 02 12 14 FF A5 F0(都是16进制),F0 5A是包头,A5 F0是包尾,黑色15是命令代号,中间蓝色是我想发的数据,橙色FF是校验位。只要包头包尾校验正确,基本这串指令不会有问题。

UART中断函数:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
	unsigned char temp;
	receive0[receive0_tail]=aRxBuffer;
	temp=receive0[receive0_tail];
	if((temp == 0xf0)&&(head0_flag == 0))
	{
	  head0_flag=1;
		receive0_len=1;
	}
	else if(head0_flag == 1)
	{
	  if(temp==0x5a)
		{
		  head0_flag = 2;
			receive0_len++;
		}
		else
		{
		  head0_flag = 0;
		}
	}
	else if ((temp==0xa5)&&(head0_flag == 2))
	{
	  head0_flag = 3;
		receive0_len++;
	}
  else if (head0_flag == 3)
	{
	  receive0_len++;
		if(temp==0xf0)
		{
			head0_flag = 0;
			HW0_COM=1;
		}
		else
		{
		  head0_flag = 2;
		}
	}
	else 
	{
		receive0_len++;
	  if(receive0_len>70)
		{
		  receive0_len=0;
			head0_flag = 0;
		}
	}
  receive0_tail++;
	if(receive0_tail>=128)
	{
	  receive0_tail=0;
	}
	HAL_UART_Receive_IT(&huart1,&aRxBuffer,1);
}

 main函数:其中main函数是测试程序,把串口助手发来的数据再上传回去,目的是看发送和读取是否一致。

int main(void)
{
   uint8_t txbuf[100];
  /* USER CODE BEGIN 1 */
    
  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */
   
  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();

  /* USER CODE BEGIN 2 */
	command=0;
  receive0_tail=0;
	receive0_len=0;
	HW0_COM=0;
  /* USER CODE END 2 */

  memcpy(txbuf,"这是一个串口中断接收回显实验\n",100);
  HAL_UART_Transmit(&huart1,txbuf,strlen((char *)txbuf),1000);
	HAL_UART_Receive_IT(&huart1,&aRxBuffer,1);
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */
  /* USER CODE BEGIN 3 */
    command=ReadComm();
		switch(command)
		{
			case 0x15:
			{
//				memcpy(txbuf,"这是0x15\n",100);
//				HAL_UART_Transmit(&huart1,txbuf,strlen((char *)txbuf),1000);
				HAL_UART_Transmit(&huart1,receive0,strlen((char *)receive0),1000);
				HW0_COM=0;
				receive0_len=0;
				head0_flag = 0;
				receive0_tail=0;
				break;
			}
			case 0x1a:
			{
//				memcpy(txbuf,"这是0x1a\n",100);
//				HAL_UART_Transmit(&huart1,txbuf,strlen((char *)txbuf),1000);
				HAL_UART_Transmit(&huart1,receive0,strlen((char *)receive0),1000);
				HW0_COM=0;
				receive0_len=0;
				head0_flag = 0;
				receive0_tail=0;
				break;
			}
			default:
				break;
		}
     	command=0;
  }
	
  /* USER CODE END 3 */
}

详细工程:https://download.csdn.net/download/geekjin/10657761

STM32的串口接收中断使用HAL库配置通常包括以下几个步骤: 1. **初始化硬件资源**: - 包含初始化串口本身,如USART_Init()函数,设置波特率、数据位数、停止位、校验位等配置。 2. **打开串口**: - 使用HAL_UART_Open()函数开启串口通信,确认连接是否成功。 3. **注册中断处理函数**: - 在HAL_MspInit()或HAL_MspConfig()中,启用串口中断并注册回调函数,比如`HAL_UART_RxCpltCallback`,这是当接收到一帧数据后会被触发的函数。 4. **配置中断**: - 调用`HAL_UART_ITConfig()`函数,开启RXNE(接收就绪)中断,并设置适当的中断优先级。 5. **开启中断**: - 启动系统全局中断管理器,通常是通过`NVIC_EnableIRQ()`来激活串口接收中断对应的中断请求。 6. **启用中断**: - 另外还需要调用`HAL_NVIC_SetPriority()`设置中断优先级,确保中断能够及时响应。 7. **进入循环等待接收**: - 主程序进入无限循环,不断检查是否有中断发生,然后在中断服务函数中处理接收到的数据。 ```c // 示例代码片段 HAL_StatusTypeDef status; status = USART_Init(&huart1); if (HAL_OK != status) { // 处理错误 } status = HAL_UART_Open(&huart1); if (HAL_OK != status) { // 处理错误 } HAL_NVIC_SetPriority(UARTx_IRQn, 0, 0); // 设定中断优先级 HAL_NVIC_EnableIRQ(UARTx_IRQn); while (1) { if (HAL_GetITStatus(&huart1, HAL_UART_IT_RXNE) != RESET) { uint8_t data = (uint8_t)HAL_UART_Receive(&huart1, &received_data, 1, 0x00FFU); // 处理接收到的数据 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值