2015-12-30 2 views
1

Я использую Arduino-подобную библиотеку на модуле WiFi ESP8266. Код очень похож на Arduino.Соберите данные из UART на основе нескольких завершающих символов

Я собираю данные от UART и помещаю их в буфер. В настоящее время завершающим символом является '\n'. Другими словами, поток входящих данных из UART сохраняется в буфере command_buffer, и конец этих входящих данных идентифицируется '\n'. Вот соответствующий код;

void onDataCallback(Stream& stream, char arrivedChar, unsigned short availableCharsCount) 
{ 
    if (arrivedChar == '\n') // Lets show data! 
    { 
     Serial.println("<New line received>"); 
     while (stream.available()) 
     { 
      char cur = stream.read(); 
      charReceived++; 
      Serial.print(cur); 
      command_buffer[index] = cur; 
      buf_index++; 
     } 
    } 
} 

onDataCallback() является функцией обратного вызова, которая вызывается, когда входные данные, полученные от UART.

Это моя проблема. Что делать, если конечный символ не является одним символом '\n'? Что, если он состоит из нескольких двоичных символов, таких как <0xFF><0xFE><0xFA>?

Arduino-подобные библиотеки поступают из рамок SMING. https://github.com/SmingHub/Sming

ответ

1

Так вы получите ваши символы по одному за раз, вы должны помнить, состояние: Demo

#include <iostream> 
#include <string> 

namespace 
{ 
    const char uart_endl[] = "\xff\xfe\xfa"; 
    const size_t uart_endl_len = sizeof(uart_endl) - 1; 
} 

class DataReceiver 
{ 
    const char* state; 
    std::string buffer; 
public: 
    DataReceiver() : state(&uart_endl[0]) {} 
    void onDataCallback(char arrivedChar) 
    { 
     buffer.push_back(arrivedChar); 
     if (*state == arrivedChar) 
     { 
      state++; 
      if (*state == '\0') 
      { 
       state = &uart_endl[0]; 
       buffer.erase(buffer.end() - uart_endl_len, buffer.end()); 
       std::cout << buffer << std::endl; 
       buffer.clear(); 
      } 
     } 
     else 
     { 
      state = &uart_endl[0]; 
     } 
    } 
}; 

int main() 
{ 
    DataReceiver buffer; 
    buffer.onDataCallback('a'); 
    buffer.onDataCallback('b'); 
    buffer.onDataCallback('\xff'); 
    buffer.onDataCallback('\xfe'); 
    buffer.onDataCallback('\xfa'); 
    buffer.onDataCallback('c'); 
    buffer.onDataCallback('\xff'); 
    buffer.onDataCallback('d'); 
    buffer.onDataCallback('\xff'); 
    buffer.onDataCallback('\xfe'); 
    buffer.onDataCallback('e'); 
    buffer.onDataCallback('\xff'); 
    buffer.onDataCallback('\xfe'); 
    buffer.onDataCallback('\xfa'); 
    return 0; 
} 

Выход:

ab 
c�d��e 

Я надеюсь, что это помогает ,

+0

Спасибо. Upvoted. Выглядит неплохо. Я искал ответ, более подходящий для Ардуино. Я не уверен, что существуют эквивалентные функции для строковых функций 'push_back',' erase' и 'clear'. Во всяком случае, ваш ответ дал мне хороший головной убор. Большое спасибо! – user781486

+0

Если 'std :: string' не полностью реализована, вы все равно можете использовать буферы старого стиля. Удачи. – YSC

Смежные вопросы