Прием строки по serial

Тема в разделе "Arduino & Shields", создана пользователем volk, 9 янв 2018.

  1. volk

    volk Нуб

    Всем привет!

    Передаю на ардуину строку с esp, строка отправляется раз в 1 секунду, это время с ntp
    Код (C++):
    sendd = "111." + String(hour)+ "." + String(minute) + "." + String(second) + "." + String(day) + "." + String(month) + "." + String(year) + ".222";
      Serial.print(sendd);
    В монитор порта esp пишется как и задумано.

    Пытаюсь принять это на ардуино мега в 3 сериал, и вывести в первый. Но не выходит.
    Код приема такой:
    Код (C++):
      while (Serial3.available())
      {
       char temp=Serial3.read();
         if (temp>' ') {        
           c = temp -'0';
           data +=c;
         }    
         //send = true;      
       
      }
     
      Serial.print(data);
      data = " ";
      Serial3.flush();
     
    /*if(send)
      {
        Serial.println(data);
        data = " ";
        send = false;
      }*/
    Вот что в мониторе порта
    Снимок.JPG

    Куда копать?
     
  2. копать в сторону JSON
     
  3. IvanUA

    IvanUA Гуру

    Или в сторону snprintf
     
  4. ИгорьК

    ИгорьК Гуру

    Или парсить самостоятельно.
    В теме про дисплей Некстион посмотрите пример приема данных от него.
    Или про подсчет crc8 - там тоже парсятся данные. Это я только навскидку про свои темы говорю. Здесь еще сотня таких
    Вообще, с нового года гугл работает хорошо на слово "парсинг данных".
     
    vvr и IvanUA нравится это.
  5. volk

    volk Нуб

    Как я понял самый простой вариант, это использовать JSON. Сейчас читаю сижу.
     
  6. IvanUA

    IvanUA Гуру

    Ну как сказать. Мне кажется самый простой вариант когда кто то сделает это за вас)))
    А так вариантов много и с каждым из них нужно разбираться что бы понять как он работает...
     
  7. DIYMan

    DIYMan Guest

    Зачем лишние преобразования, не пойму?
    Код (C++):
    String data;
    while (Serial3.available())
      {
       char temp=Serial3.read();
           data += temp;
        }    
       
      Serial.print(data);
      data = " ";
     
    И всё.
     
  8. volk

    volk Нуб

    Сделал так. Шлю с есп по сериалу такую строку а12b25c36d....

    Разбираю на ардуине так:
    Код (C++):
     while ((Serial3.available() > 0))
      {
        if ((char(Serial3.read())) == 'a')
        {
          t1 = Serial3.parseInt();
        }
        if ((char(Serial3.read())) == 'b')
        {
          t2 = Serial3.parseInt();
        }
        if ((char(Serial3.read())) == 'c')
        {
          t3 = Serial3.parseInt();
        }
      }
     
    Работает, но иногда данные сбиваются. Как повысить работоспособность?
     
  9. Unixon

    Unixon Оракул Модератор

    Написать код правильно. Вы дожидаетесь только первого байта, а не всего сообщения.
     
  10. IvanUA

    IvanUA Гуру

    Таки не понятно, что конкретно вы хотите сделать со строкой получаемую по сериалу? Просто принять и передать ее дальше, или же распарсить и достать из нее какие то данные, в каком формате?
    От этих исходников зависит и метод который нужно будет реализовать...
    А так простите можно гадать до следующего нового года...
     
  11. OlegROA

    OlegROA Нерд

    Как уже заметил Unixon, Вам необходимо объединить метод чтения байта из порта с проверкой на его существование - даже если все три байта были посланы непосредственно друг за дружкой, то это совсем не означает, что все они сразу попадут в приемный буфер, о наличие информации в котором и сообщает метод available().
     
  12. volk

    volk Нуб

    Эти переменные я буду выводить на экран, ни чего делать с ними не буду.
     
  13. Unixon

    Unixon Оракул Модератор

    Serial.available() возвращает количество байт в буфере. Если длина сообщения заранее известна, проверяете условие типа if (Serial.available() >= MSG_LEN), но MAX_LEN не может быть больше кольцевого буфера UART. Если длина неизвестна, то (а) принимаете байты до тех пор пока не встретится байт, означающий конец сообщения, либо (б) в начале сообщения передаете его длину, а потом само сообщение.