这篇博客以有人网4G dtu网络盒子使用为例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | #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; } |