Задумал сделать пакетную передачу данных Arduino и PC, но что то пошло не так....

saskemasaske
Offline
Зарегистрирован: 08.12.2018

Здравствуйте форумчане, обращаюсь к вам за помощью. Задумал я сделать пакетную передачу данных для arduino и PC. Нашёл в интернете такую штуку:

http://robocraft.ru/blog/1090.html

и всё скопировал

String sp_startMarker;           // Переменная, содержащая маркер начала пакета
String sp_stopMarker;            // Переменная, содержащая маркер конца пакета
String sp_dataString;            // Здесь будут храниться принимаемые данные
int sp_startMarkerStatus;        // Флаг состояния маркера начала пакета
int sp_stopMarkerStatus;         // Флаг состояния маркера конца пакета
int sp_dataLength;               // Флаг состояния принимаемых данных
boolean sp_packetAvailable;      // Флаг завершения приема пакета
int bufferChar;
long previousMillis = 0;        // храним время последнего переключения светодиода
 int ledState = LOW;
long interval = 1000;           // интервал между включение/выключением светодиода (1 секунда)


String versionString;                               // Строка, содержащая какую-нибудь бесполезную информацию :)

void setup() 
{    
  versionString = "Version of serial protocol";    // Присваиваем  бессмысленное значение бесполезной строке :)
  Serial.begin(9600);                               // Инициализируем последовательный интерфейс
  sp_SetUp();                                       // Инициализируем протокол.
  sp_Send("ver?");
  pinMode(13, OUTPUT);
}

void loop() 
{
unsigned long currentMillis = millis();
  
  //проверяем не прошел ли нужный интервал, если прошел то
  if(currentMillis - previousMillis > interval) {
    // сохраняем время последнего переключения
    previousMillis = currentMillis; 
 
    // если светодиод не горит, то зажигаем, и наоборот
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;
 
    // устанавливаем состояния выхода, чтобы включить или выключить светодиод
    digitalWrite(13, ledState);
  }

}
void feedback()
{
  Serial.print("bufferChar=");
  Serial.println(bufferChar);
  Serial.print("sp_dataString=");
  Serial.println(sp_dataString);
    Serial.print("sp_startMarkerStatus=");
  Serial.println(sp_startMarkerStatus);
    Serial.print("sp_stopMarkerStatus=");
  Serial.println(sp_stopMarkerStatus);
    Serial.print("sp_dataLength=");
  Serial.println(sp_dataLength);
    Serial.print("sp_packetAvailable=");
  Serial.println(sp_packetAvailable);
  Serial.println();
}
void ParseCommand()
{
  if(sp_dataString == "ver?")   // Если была принята строка «ver?»
  {
   sp_Send(versionString);      // Отправляем на PC содержимое строки «versionString»
  }
  
}


void sp_SetUp()
{
  sp_startMarker = "bspm";     // Так будет выглядеть маркер начала пакета
  sp_stopMarker = "espm";      // Так будет выглядеть маркер конца пакета
  sp_dataString.reserve(64);     // Резервируем место под прием строки данных
  sp_ResetAll();                 // Полный сброс протокола
}

void sp_ResetAll()
{
  sp_dataString = "";           // Обнуляем буфер приема данных
  sp_Reset();                   // Частичный сброс протокола
}

void sp_Reset()
{
  sp_startMarkerStatus = 0;     // Сброс флага маркера начала пакета
  sp_stopMarkerStatus = 0;      // Сброс флага маркера конца пакета
  sp_dataLength = 0;            // Сброс флага принимаемых данных
  sp_packetAvailable = false;   // Сброс флага завершения приема пакета
}

void sp_Send(String data)
{
  Serial.print(sp_startMarker);         // Отправляем маркер начала пакета
  Serial.print(data.length());          // Отправляем длину передаваемых данных
  Serial.print(data);                   // Отправляем сами данные
  Serial.print(sp_stopMarker);          // Отправляем маркер конца пакета
}

void serialEvent() 
{
 sp_Read();                         // Вызов «читалки» принятых данных
 if(sp_packetAvailable)             // Если после вызова «читалки» пакет полностью принят
 {
  ParseCommand();                   // Обрабатываем принятую информацию
  sp_ResetAll();                    // Полный сброс протокола.
 }
}

void sp_Read()
{
  Serial.print("step=");
  Serial.println(1);
  feedback();
  while(Serial.available() && !sp_packetAvailable)            // Пока в буфере есть что читать и пакет не является принятым
  {
        Serial.print("step=");
  Serial.println(2);
    feedback();
    bufferChar = Serial.read();                           // Читаем очередной байт из буфера
        Serial.print("step=");
  Serial.println(3);
    feedback();
    if(sp_startMarkerStatus < sp_startMarker.length())        // Если стартовый маркер не сформирован (его длинна меньше той, которая должна быть) 
    {  
     if(sp_startMarker[sp_startMarkerStatus] == bufferChar)   // Если очередной байт из буфера совпадает с очередным байтом в маркере
     {
         Serial.print("step=");
  Serial.println(4);
      feedback();
       sp_startMarkerStatus++;                                // Увеличиваем счетчик совпавших байт маркера
          Serial.print("step=");
  Serial.println(5);
       feedback();
     }
     else
     {
         Serial.print("step=");
  Serial.println(6);
      feedback();
       sp_ResetAll();                                         // Если байты не совпали, то это не маркер, расходимся. 
        Serial.print("step=");
  Serial.println(7);
     feedback();
     }
    }  
    else
    {
     // Стартовый маркер прочитан полностью
       if(sp_dataLength <= 0)                                 // Если длинна пакета на установлена
       {
            Serial.print("step=");
  Serial.println(8);
        feedback();
         sp_dataLength = bufferChar;                          // Значит этот байт содержит длину пакета данных
           Serial.print("step=");
  Serial.println(9);
       feedback();
       }
      else                                                    // Если прочитанная из буфера длинна пакета больше нуля
      {
        if(sp_dataLength > sp_dataString.length())            // Если длинна пакета данных меньше той, которая должна быть
        {
             Serial.print("step=");
  Serial.println(10);
          feedback();
          sp_dataString += (char)bufferChar;                  // прибавляем полученный байт к строке пакета
            Serial.print("step=");
  Serial.println(11);
        feedback();
        }
        else                                                  // Если с длинной пакета данных все нормально
        {
          if(sp_stopMarkerStatus < sp_stopMarker.length())    // Если принятая длинна маркера конца пакета меньше фактической
          {
            if(sp_stopMarker[sp_stopMarkerStatus] == bufferChar)  // Если очередной байт из буфера совпадает с очередным байтом маркера
            {
                  Serial.print("step=");
  Serial.println(12);
              feedback();
              sp_stopMarkerStatus++;      // Увеличиваем счетчик удачно найденных байт маркера
                  Serial.print("step=");
  Serial.println(13);
              feedback();
              if(sp_stopMarkerStatus == sp_stopMarker.length())
              {
                // Если после прочтения очередного байта маркера, длинна маркера совпала, то сбрасываем все флаги (готовимся к приему нового пакета)
                   Serial.print("step=");
  Serial.println(14);
                feedback();
                sp_Reset();    
                   Serial.print("step=");
  Serial.println(15);
                feedback();
                sp_packetAvailable = true;                        // и устанавливаем флаг готовности пакета
                 Serial.print("step=");
  Serial.println(16);
              feedback();
              }
            }
            else
            {
                 Serial.print("step=");
  Serial.println(17);
              feedback();
              sp_ResetAll();                                      // Иначе это не маркер, а хз что. Полный ресет.
               Serial.print("step=");
  Serial.println(18);
            feedback();
            }
          }
          //
        }
      } 
    }    
  }
}

запускаю, и, судя по тому, что мне в ответ на "bspm4ver?espm", шлёт ардуина,

bspm4ver?espm

step=1
bufferChar=0
sp_dataString=
sp_startMarkerStatus=0
sp_stopMarkerStatus=0
sp_dataLength=0
sp_packetAvailable=0

step=2
bufferChar=0
sp_dataString=
sp_startMarkerStatus=0
sp_stopMarkerStatus=0
sp_dataLength=0
sp_packetAvailable=0

step=3
bufferChar=98
sp_dataString=
sp_startMarkerStatus=0
sp_stopMarkerStatus=0
sp_dataLength=0
sp_packetAvailable=0

step=4
bufferChar=98
sp_dataString=
sp_startMarkerStatus=0
sp_stopMarkerStatus=0
sp_dataLength=0
sp_packetAvailable=0

step=5
bufferChar=98
sp_dataString=
sp_startMarkerStatus=1
sp_stopMarkerStatus=0
sp_dataLength=0
sp_packetAvailable=0

step=2
bufferChar=98
sp_dataString=
sp_startMarkerStatus=1
sp_stopMarkerStatus=0
sp_dataLength=0
sp_packetAvailable=0

step=3
bufferChar=115
sp_dataString=
sp_startMarkerStatus=1
sp_stopMarkerStatus=0
sp_dataLength=0
sp_packetAvailable=0

step=4
bufferChar=115
sp_dataString=
sp_startMarkerStatus=1
sp_stopMarkerStatus=0
sp_dataLength=0
sp_packetAvailable=0

step=5
bufferChar=115
sp_dataString=
sp_startMarkerStatus=2
sp_stopMarkerStatus=0
sp_dataLength=0
sp_packetAvailable=0

step=2
bufferChar=115
sp_dataString=
sp_startMarkerStatus=2
sp_stopMarkerStatus=0
sp_dataLength=0
sp_packetAvailable=0

step=3
bufferChar=112
sp_dataString=
sp_startMarkerStatus=2
sp_stopMarkerStatus=0
sp_dataLength=0
sp_packetAvailable=0

step=4
bufferChar=112
sp_dataString=
sp_startMarkerStatus=2
sp_stopMarkerStatus=0
sp_dataLength=0
sp_packetAvailable=0

step=5
bufferChar=112
sp_dataString=
sp_startMarkerStatus=3
sp_stopMarkerStatus=0
sp_dataLength=0
sp_packetAvailable=0

step=2
bufferChar=112
sp_dataString=
sp_startMarkerStatus=3
sp_stopMarkerStatus=0
sp_dataLength=0
sp_packetAvailable=0

step=3
bufferChar=109
sp_dataString=
sp_startMarkerStatus=3
sp_stopMarkerStatus=0
sp_dataLength=0
sp_packetAvailable=0

step=4
bufferChar=109
sp_dataString=
sp_startMarkerStatus=3
sp_stopMarkerStatus=0
sp_dataLength=0
sp_packetAvailable=0

step=5
bufferChar=109
sp_dataString=
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=0
sp_packetAvailable=0

step=2
bufferChar=109
sp_dataString=
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=0
sp_packetAvailable=0

step=3
bufferChar=52
sp_dataString=
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=0
sp_packetAvailable=0

step=8
bufferChar=52
sp_dataString=
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=0
sp_packetAvailable=0

step=9
bufferChar=52
sp_dataString=
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=2
bufferChar=52
sp_dataString=
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=3
bufferChar=118
sp_dataString=
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=10
bufferChar=118
sp_dataString=
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=11
bufferChar=118
sp_dataString=v
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=2
bufferChar=118
sp_dataString=v
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=3
bufferChar=101
sp_dataString=v
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=10
bufferChar=101
sp_dataString=v
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=11
bufferChar=101
sp_dataString=ve
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=2
bufferChar=101
sp_dataString=ve
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=3
bufferChar=114
sp_dataString=ve
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=10
bufferChar=114
sp_dataString=ve
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=11
bufferChar=114
sp_dataString=ver
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=2
bufferChar=114
sp_dataString=ver
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=3
bufferChar=63
sp_dataString=ver
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=10
bufferChar=63
sp_dataString=ver
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=11
bufferChar=63
sp_dataString=ver?
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=2
bufferChar=63
sp_dataString=ver?
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=3
bufferChar=101
sp_dataString=ver?
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=10
bufferChar=101
sp_dataString=ver?
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=11
bufferChar=101
sp_dataString=ver?e
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=2
bufferChar=101
sp_dataString=ver?e
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=3
bufferChar=115
sp_dataString=ver?e
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=10
bufferChar=115
sp_dataString=ver?e
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=11
bufferChar=115
sp_dataString=ver?es
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=2
bufferChar=115
sp_dataString=ver?es
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=3
bufferChar=112
sp_dataString=ver?es
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=10
bufferChar=112
sp_dataString=ver?es
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=11
bufferChar=112
sp_dataString=ver?esp
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=2
bufferChar=112
sp_dataString=ver?esp
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=3
bufferChar=109
sp_dataString=ver?esp
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=10
bufferChar=109
sp_dataString=ver?esp
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

step=11
bufferChar=109
sp_dataString=ver?espm
sp_startMarkerStatus=4
sp_stopMarkerStatus=0
sp_dataLength=52
sp_packetAvailable=0

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

saskemasaske
Offline
Зарегистрирован: 08.12.2018

заменил Serial.print на Serial.write всё заработало как часы