从串行端口读取JSON,缺少部分起始数据

时间:2019-06-12 16:32:52

标签: json char serial-port arduino-esp8266 arduino-c++

从ESP8266的串行端口读取JSON字符串时,它会切断数据的开头。

我已经尝试从串行端口读取数据并打印每个字符,但是这切断了部分数据的请求。


void setup() {
  Serial.begin(115200);
  while (!Serial) {
      ;
  }
}

void loop() {
  int curSize = 30;
  char* buffer = new char[curSize];
  std::fill_n(buffer, curSize, 0);
  int pos = 0;
    Serial.print("Sending: ");
    while(Serial.available() == false) delay(500);
  while (Serial.available()) {
    char c = Serial.read();
    Serial.print(c);
     if(pos == curSize-1){
            char* newBuffer = increaseBuffer(buffer, curSize, curSize + 30);
            curSize += 30;
            delete[] buffer;
            buffer = newBuffer;
    }
    if(c == '\n'){
      buffer[pos] = 0;
      pos = 0;
      break;
    }
    buffer[pos++] = c;
  }
  if(buffer[0] != 0) {
    sendBuffer(buffer);
  }
  delete[] buffer;
}

char* increaseBuffer(char* orig, int oldSize, int newSize){
  char* data = new char[newSize];
  std::fill_n(data, newSize, 0);
  for(int i = 0; i < newSize; i++){
    if(i < oldSize) data[i] = orig[i];
    else data[i] = '\0';
  }
  return data;
}

使用的JSON数据(和预期的输出)

{"type":0,"ver":"0.0.1","T":[28,29,29,29,29,29,29,29,29,29],"H":[59.1608,59.1608,60,59.1608,60,60,60,59.1608,59.1608,59.1608],"DP":[20.36254,20.36254,20.59363,20.36254,20.59363,20.59363,20.59363,20.36254,20.36254],"HI":[30.90588,30.90588,31.0335,30.90588,31.0335,31.0335,31.0335,30.90588,30.90588]}

实际输出内容的示例

Example 1: 9,29,29,29,29,29,29,29,29],"H":[59.1608,59.1608,60,59.1608,60,60,60,59.1608,59.1608,59.1608],"DP":[20.36254,20.36254,20.59363,20.36254,20.59363,20.59363,20.59363,20.36254,20.36254],"HI":[30.90588,30.90588,31.0335,30.90588,31.0335,31.0335,31.0335,30.90588,30.90588]}
Example 2: 29,29,29,29,29,29,29,29,29],"H":[59.1608,59.1608,60,59.1608,60,60,60,59.1608,59.1608,59.1608],"DP":[20.36254,20.36254,20.59363,20.36254,20.59363,20.59363,20.59363,20.36254,20.36254],"HI":[30.90588,30.90588,31.0335,30.90588,31.0335,31.0335,31.0335,30.90588,30.90588]}

1 个答案:

答案 0 :(得分:0)

尝试在等待数据开始进入的阻塞循环中将延迟设为1,而不是500。我将猜测发生的情况是该循环Serial.available()的一次迭代为假,并且在延迟您开始获取输入的数据,直到您的延迟结束再次检查时才被覆盖。

我正在描绘的是以下内容。如果将那个delay(500)扩展为被称为500次的delay(1)。

while(Serial.available() == false){
    delay(1);
    delay(1);
    // ...
    delay(1); // first character comes in 
    delay(1); 
    delay(1); // second character comes in
    // ... 
    delay(1); // n character comes in
}

然后,延迟结束后,您实际上开始收集即将出现的字符。