При чтении JSON из последовательного порта отсутствует часть начальных данных - PullRequest
0 голосов
/ 12 июня 2019

При чтении строки JSON из последовательного порта на ESP8266 он обрезает начало данных.

Я пробовал читать данные с последовательного порта и печатать каждый символ, однако он обрезает частьначала данных.


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 голосов
/ 12 июня 2019

Попробуйте сделать задержку 1 вместо 500 в цикле блокировки, который ожидает начала поступления данных. Я собираюсь догадаться, что произойдет, если на одной итерации этого цикла Serial.available() будет ложным, и во время задержки выначинайте получать поступающие данные, которые заканчиваются перезаписью к тому времени, когда ваша задержка заканчивается, чтобы проверить снова.

Я представляю следующее.Если вам нужно расширить эту задержку (500) до задержки (1), вызываемой в 500 раз.

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
}

Затем, после того, как задержка закончится, вы начнете фактически собирать поступающие символы.

...