0. 多串口数据互传
多串口互传的目的是什么?
多串口互传中遇到最大的问题是什么?
多串口互传是怎样实现的?
这里写串口互传(主要是串口1和串口2)目的在于便于调试,即电脑端知道最终ESP8266-01s的响应内容并进行调试。其核心在于Usart2收到回复后触发中断,并在中断中判断收到数据的完整性,若接收到响应数据完整则让该数据通过Usart1的TX发送到电脑串口端,电脑端进行接收。要实现此需要以下:
-
自定义串口数据接收结构体以实现多字节串口数据的保存
typedef struct {/* data *///接收数组进行多字节数据存储uint8_t RxBuffer[RX_BUFFER_SIZE];//每次每个字节接受对象uint8_t RxData;//进行存储时需要的数组下标uint16_t RxDataCnt; }UART_RxTypeDef; //默认初始化:UART_RxTypeDef Uart2Rx = {{0}, 0, 0};
-
Usart2的接收中断回调函数(实现接收到一个字节数据向缓冲区存储一个字节数据)
void USART2_Receive_Callback() {Uart2Rx.RxBuffer[Uart2Rx.RxDataCnt++] = Uart2Rx.RxData; //1.防止结构体出现栈溢出if (Uart2Rx.RxDataCnt > RX_BUFFER_SIZE){//初始化清空RxBuffermemset(Uart2Rx.RxBuffer, 0x00, sizeof(Uart2Rx.RxBuffer));Uart2Rx.RxDataCnt = 0;return;}//2.ESP8266 -01s收到的AT指令响应结束if (Uart2Rx.RxBuffer[Uart2Rx.RxDataCnt-2] == '\r' && Uart2Rx.RxBuffer[Uart2Rx.RxDataCnt-1] == '\n'){//双重检测AT指令结束与否if (strstr((char *)Uart2Rx.RxBuffer, "OK\r\n") != NULL ||strstr((char *)Uart2Rx.RxBuffer, "ERROR\r\n") != NULL){/* 当接受到结束数据时,串口1向计算机端传输响应内容,并等待传输完成*/HAL_UART_Transmit(&huart1, (uint8_t *)Uart2Rx.RxBuffer, Uart2Rx.RxDataCnt, 0xFFFF);while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//相关初始化接收状态标志位置1WirelessStatus.receiveDataFlag = 1;}}//重新打开中断开关HAL_UART_Receive_IT(&huart2, (uint8_t *)&Uart2Rx.RxData, 1); }
这里还需要注意的是单个字符char是占一个字节(8位)。
-
相关串口的中断初始化
HAL_NVIC_SetPriority(USART1_IRQn,1,1); HAL_NVIC_EnableIRQ(USART1_IRQn); ....//接收使能初始化 void Usart_Recevie_Init(void) {HAL_UART_Receive_IT(&huart1, (uint8_t *)&Uart1Rx.RxData, 1);HAL_UART_Receive_IT(&huart2, (uint8_t *)&Uart2Rx.RxData, 1); }