【STM32的HAL库开发】串口控制台的实现

【STM32的HAL库开发】串口控制台

串口接收函数

在串口中断中逐字节接收XCOM发来的指令。XCOM在发送文本时会自动附加 0x0a 0x0d (ASCII: \r\n )两个字符。因此每当接收到0x0d时就给控制台的 console_exe() 插旗 (CONSOLE_FLAG) ,在 main.c 的主循环中扫描该旗子。


/**
  * @brief This function handles USART1 global interrupt.
  */
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
	uint8_t temp;
	
	if(USART1->SR & 0x00000020){
		temp = USART1->DR;
		RX_BUFF[RX_CNT++] = temp;		
		if(temp==0x0d)console_setflag();
	}
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
	__HAL_UART_ENABLE_IT(&huart1,UART_IT_ERR);
	__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);
  /* USER CODE END USART1_IRQn 1 */
}

控制台定向函数

若未插旗则直接return,否则比较接收到的字符与预设的指令,进入不同的响应函数;若未匹配到一致的函数则返回熟悉的错误提示。
在exe函数的末尾清空串口接收缓存。LED_Y作为指示灯,可以去掉。


void console_exe(void){
	if(!CONSOLE_FLAG){
		return;
	}else{
		CONSOLE_FLAG = 0;
	}

	printf("console> ");
	if(!strcmp(RX_BUFF,"hi\r\n"))						{printf("yo~");}
	else if(!strcmp(RX_BUFF,"battery\r\n"))	{cmd_battery();}
	else if(!strcmp(RX_BUFF,"exit\r\n"))		{cmd_exit();}
	else if(!memcmp(RX_BUFF,"flash",5))			{cmd_flash();}
	else {
		printf("unknown cmd '%s'",RX_BUFF);
		cmd_help();
	}
	printf("\r\n");
	
	for(;RX_CNT!=0;RX_CNT--)RX_BUFF[RX_CNT] = 0;
	LED_Y = !LED_Y;
}

实测

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41100189/article/details/104028331