【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;
}
实测
>金山毒霸2007