Прием команды с HC-06 и парсинг

Twilkeris
Offline
Зарегистрирован: 05.02.2016

Добрый день, уважаемые форумчане!

С устройства отправляю команду в виде: #typeCoomand:c1:c2:c3# .

Каждый тип команды имеет фиксированный набор c_i, где c_i - целые числа. С устройства отправляю корректную команду, т.е. гарантию для каждого typeCoomand соответствующее кол-во c. Все c записываю в массив command[].

Когда отправляю команды с большим промежутком времени, то всё хорошо. Если начинаю отправлять очень часто - происходит сбой алгоритма. Насколько я понимаю, в буфере накапливается больше, чем одна команда и происходит сбой. Подскажите пожалуйста, как можно исправить. 

#include <SoftwareSerial.h>// import the serial library

SoftwareSerial mySerial(10, 11); // 10-й пин = TX, 11-й пин = RX


const char flagCommand = '#';
const char delimiter = ':';

const int type_commands[] = {1, 2};
const int length_commands[] = {2, 4};
const int num_commands = sizeof(type_commands) / sizeof(int);


void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
}

void loop() {
  if(mySerial.available() > 0){ 
    String str = mySerial.readString();
    Serial.println(str);

    char * pch = strtok(str.c_str(), "#:");  
    int typeCmd = (String(pch)).toInt();
    pch = strtok(NULL, "#:");

    Serial.println("typeCmd:");
    Serial.println(typeCmd);

    for(int numCmd=0; numCmd < num_commands; numCmd++){
      
      if(typeCmd == type_commands[numCmd]){
        int command[length_commands[numCmd]];

        int k = 0;
        while(pch != NULL){
          command[k] = (String(pch)).toInt();
          pch = strtok(NULL, "#:");
          k++;
        }

        for(int i=0; i<length_commands[numCmd]; i++){
          Serial.println(command[i]);
        }
      }
    }
    
  }
  
}

 

Twilkeris
Offline
Зарегистрирован: 05.02.2016

Просьба удалить тему, разобрался. 

vvadim
Offline
Зарегистрирован: 23.05.2012

дык покажите народу решение.

Twilkeris
Offline
Зарегистрирован: 05.02.2016

Алгоритм верный, только нужно входную строку считывать корректно. Вначале из буфера считываете строчку в нужной форме (в данном случае от '#' до '#'), потом её обрабатываете приведенным в первом сообщении алгоритмом.