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

这篇博客以有人网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;
}