主页 > 人工智能  > 

03-uart1-interrupt-BlueTouch-LED

03-uart1-interrupt-BlueTouch-LED
uart1中断模式点灯 uart1接入蓝牙模块 9600uart1接入正常调试 115200PC13是LED1
常规中断代码 #include "stdio.h" #include "string.h" #define UART1_REC_LEN 200 uint8_t buf=0; //串口接收缓存(1字节) uint8_t UART1_RX_Buffer[UART1_REC_LEN]; uint16_t UART1_RX_STA=0; int fputc(int ch, FILE *f) { unsigned char temp[1]={ch}; HAL_UART_Transmit(&huart1,temp,1,0xffff); return ch; } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { // 判断中断是由哪个串口触发的 if(huart->Instance == USART1) { // 判断接收是否完成(UART1_RX_STA bit15 位是否为1) if((UART1_RX_STA & 0x8000) == 0) { // 如果已经收到了 0x0d (回车), if(UART1_RX_STA & 0x4000) { // 则接着判断是否收到 0x0a (换行) if(buf == 0x0a) // 如果 0x0a 和 0x0d 都收到,则将 bit15 位置为1 UART1_RX_STA |= 0x8000; else // 否则认为接收错误,重新开始 UART1_RX_STA = 0; } else // 如果没有收到了 0x0d (回车) { //则先判断收到的这个字符是否是 0x0d (回车) if(buf == 0x0d) { // 是的话则将 bit14 位置为1 UART1_RX_STA |= 0x4000; } else { // 否则将接收到的数据保存在缓存数组里 UART1_RX_Buffer[UART1_RX_STA & 0X3FFF] = buf; UART1_RX_STA++; // 如果接收数据大于UART1_REC_LEN(200字节),则重新开始接收 if(UART1_RX_STA > UART1_REC_LEN - 1) UART1_RX_STA = 0; } } } // 重新开启中断 HAL_UART_Receive_IT(&huart1, &buf, 1); } } 业务点灯代码 /* USER CODE BEGIN WHILE */ HAL_UART_Receive_IT(&huart1, &buf, 1); while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ if(UART1_RX_STA & 0x8000) { printf("res:%s\r\n",UART1_RX_Buffer); if(!strcmp((const char *)UART1_RX_Buffer, "ON")) { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_RESET){ printf("led1 on\r\n"); memset(UART1_RX_Buffer,0,sizeof(UART1_RX_Buffer)); } } else if (!strcmp((const char *)UART1_RX_Buffer, "OFF")) { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_SET){ printf("led1 off\r\n"); memset(UART1_RX_Buffer,0,sizeof(UART1_RX_Buffer)); } } else { if(UART1_RX_Buffer[0] != '\0') printf("指令发送错误:%s\r\n", UART1_RX_Buffer); memset(UART1_RX_Buffer,0,sizeof(UART1_RX_Buffer)); } // printf("\r\n"); // 重新开始下一次接收 memset(UART1_RX_Buffer,0,sizeof(UART1_RX_Buffer)); UART1_RX_STA = 0; } //printf("hello liangxu\r\n"); HAL_Delay(40); } /* USER CODE END 3 */ (*)注意初次中断开启

(*)注意:重定向printf必须勾选棒

注意AT指令,勾选新行 中断接收数据:检测是回车和换行\r\n 蓝牙模块:是波特率9600 重定向printf必须勾选棒

标签:

03-uart1-interrupt-BlueTouch-LED由讯客互联人工智能栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“03-uart1-interrupt-BlueTouch-LED