Arduino串口多字节接收,字符分割

#define UART_PC Serial #define UART_4GDTU Serial2 char * str; #define MAX_PACKETSIZE 128 // 4G dtu通信串口接收缓冲buff长度 char uart_4Gdtu_Receive_Buff[MAX_PACKETSIZE]; // 4Gdtu缓冲buff unsigned int uart_4Gdtu_Receive_Index = 0; // 4Gdtu收到的字节实际长度 unsigned long preUart4GdtuTime = 0; // 记录读取4Gdtu最后一个字节时间点 // 向PC发送多字节数据 void sendUartData(char * p) { char t[6]; memset(t, 0x00, sizeof(t)); memcpy(t, p, sizeof(t)); UART_PC.write(t, sizeof(t)); } // 向服务器发送数据 void send4GdtuData(char * p) { UART_4GDTU.print(p); UART_PC.print(F('[GET REQ Send]:')); UART_PC.println(p); } // 处理4Gdtu串口数据 void parseUartPackage(char * p, int len) { str = p; p = ''; // 清空数据 UART_PC.print(F('[UART_4GDTU Read parse]:')); UART_PC.println(str); } // 4Gdtu 串口接收进程 void doUart4GdtuTick() { if (UART_4GDTU.available()) { // 每次读取一个字节数据存储到这个buff中 uart_4Gdtu_Receive_Buff[uart_4Gdtu_Receive_Index++] = UART_4GDTU.read(); preUart4GdtuTime = millis(); // 记录读取这个数据的时间点 // 判断读取到的数据长度是否超过设定的记录长度,超过长度时间点往前200ms,立即执行分析函数 if (uart_4Gdtu_Receive_Index > MAX_PACKETSIZE - 1) { uart_4Gdtu_Receive_Index = MAX_PACKETSIZE - 2; preUart4GdtuTime = preUart4GdtuTime - 200; } } // 判断收到的最后一个字节后超过100ms开始执行分析函数 if (uart_4Gdtu_Receive_Index > 0 && (millis() - preUart4GdtuTime >= 100)) { // 处理串口函数,把buff最后一个字节设为0 uart_4Gdtu_Receive_Buff[uart_4Gdtu_Receive_Index] = 0x00; UART_4GDTU.flush(); // 执行串口处理函数 parseUartPackage(uart_4Gdtu_Receive_Buff, uart_4Gdtu_Receive_Index); uart_4Gdtu_Receive_Index = 0; } } // 字符串分割 参数str:被查找字符 b_str:对比的字符串头 e_str:查找的结束符 dest:获取到的字符串 len:想要获取的长度 char * parse_str(char * str, char * b_str, char * e_str, char * dest, int len) { char * pos, * p, * p2; int i; pos = strstr(str, b_str); if (pos == NULL) { return NULL; } pos = pos + strlen(b_str); p = pos; if (e_str == NULL) { p2 = NULL; } else { p2 = strstr(str, e_str); } if (p2 == NULL) { p2 = str + strlen(str); } i = 0; for (i = 0; p < p2 && (* p) && i < len; dest[i++] = * p, ++p); dest = 0; return dest; }

(0)

相关推荐