Проблема передачи данных с пк.

Тема в разделе "Arduino & Shields", создана пользователем ALeska811, 6 дек 2021.

  1. ALeska811

    ALeska811 Нерд

    Передаю строку с пк: (режим яркость скорость R G B номер)
    Считываю на ардуинке вот-так:
    Код (C++):
    void parsing() {
      while (Serial.available() > 0) {
        char incomingByte = Serial.read();  
        if (incomingByte == '$') {            
          getStarted = true;                  
        } else if (incomingByte != ';' && getStarted) {
         
          inputData[index] = incomingByte;
          index++;
          inputData[index] = NULL;
        } else {
          if (getStarted) {
            char *p = inputData;
            char *str;
            index = 0;
            String value = "";
            while ((str = strtok_r(p, " ", & p)) != NULL) {
              string_convert = str;
              intData[index] = string_convert.toInt();
              index++;
            }
            index = 0;
          }
        }
        if (incomingByte == ';') {      
          getStarted = false;
          recievedFlag = true;
        }
      }
    }
    Все вроде работает, но я хочу передать цвет на каждый светодиод в реальном времени, для этого мне нужна скорость порта 115200, но на этой скорости у меня начинают путаться переменные, вообще они путаются даже на скорости 38400(Вместо яркости может меняться скорость, или вообще хаотично меняется режим). Как это исправить?
     
  2. DetSimen

    DetSimen Гуру

    заменить написанное тобой авнищще на протокол передачи с контрольной суммой.
     
    issaom нравится это.
  3. issaom

    issaom Гуру

    А как выглядит передаваемая строка, и из какого приложения если не секрет ?
     
  4. Asper Daffy

    Asper Daffy Иксперд

    Написать нормальную программу приёма. Не использовать один и тот же буфер и один и тот же индекс для всего подряд, и вообще, нормально написать.
     
  5. ALeska811

    ALeska811 Нерд

    Приложение на C#, написал сам. Строка выглядит например так: $ 1 100 15 255 205 201 1 ;
     
  6. issaom

    issaom Гуру

    Я так понял 7 байт надо передать получается ? Дак и передавайте их как байты, а не как строки, В C# это делается легко. На на Ардуино выгребаете, 1 байт это режим, 2 байт яркость и.т.д. Зачем тут вообще строки нужны ?
     
  7. ALeska811

    ALeska811 Нерд

    Есть ссылочка на пример?
     
  8. issaom

    issaom Гуру

    У меня есть пара примеров на форуме, но там самодельный ASCII протокол, (один байт передается 2-мя символами 0....F в 16-й системе.), команды можно передавать прочими незанятыми символами из таблицы ASCII. Сейчас я бы конечно так делать не стал, и засунул всю обработку в процедуру прерывания, но так делаете Вы делать точно нельзя. Там можно поизвращаться на самом деле, но раз единственное что вам пришло в голову, это прарсить строки, с двоичной и шестнадцатеричной системой у вас как то не очень, а без них ни как....
     
  9. ALeska811

    ALeska811 Нерд

    Тоесть проще метода нет?
     
  10. issaom

    issaom Гуру

    У меня там кажись и так всё просто... Куда ещё проще то?
     
    ALeska811 нравится это.
  11. ALeska811

    ALeska811 Нерд

    Большое спасибо, я сначала не увидел что во втором примере есть convert to int32
     
  12. ALeska811

    ALeska811 Нерд

    Еще вопросик, считываю яркость(BR):
    Код (C++):
     switch (StrControl.charAt(1)) {      
        case 'm':
          mode = hexToInt32(StrControl);
          EEPROM.write(0,mode);
          break;
          case 's':
          speedt = hexToInt32(StrControl);
          EEPROM.write(1,speedt);
          break;
          case 'y':
          BR = hexToInt32(StrControl);
         strip.setBrightness(BR);
          EEPROM.write(2,BR);
          break;
          case 'r':
          sr = hexToInt32(StrControl);
           EEPROM.write(3,sr);
          break;
             case 'g':
          sg = hexToInt32(StrControl);
           EEPROM.write(4,sg);
          break;
             case 'b':
          sb = hexToInt32(StrControl);
           EEPROM.write(5,sb);
          break;
            case 'i':
          id = hexToInt32(StrControl);
          break;
    Но она меняется не равномерно, то есть тяну ползунок, а лента то ярче,то тухнет, в чем проблема?
     
  13. ALeska811

    ALeska811 Нерд

    И значения иногда путаются.
     
  14. parovoZZ

    parovoZZ Гуру

    А что мешает вместо символов передавать коды?
    Честно говоря, даже не понимаю вопроса, т.к. не понимаю, где здесь можно накосячить? У меня на скорости в 200 000 все пулялось только в путь.
     
    b707 нравится это.
  15. ALeska811

    ALeska811 Нерд

    Вместо каких символов, какие коды? И в какой программе?
     
  16. ALeska811

    ALeska811 Нерд

    Вы про первый код?
     
  17. Asper Daffy

    Asper Daffy Иксперд

    В отсутствие знаний.

    Смотрим на код. Если у строки StrControl первый символ - 'm ' (или 's', или 'y' и т.д.), то какой там нахрен может быть hexToInt32? Ни одна из перечисленных в case букв (кроме 'b') не является шестнадцатеричной цифрой.
     
  18. ALeska811

    ALeska811 Нерд

    Управляющие буквы отсекаются в методе hextoInt32
    Код (C++):
    int32_t hexToInt32 (String StrControlHex) {      // -2147483648 : 2147483647 (4 байта)

      uint8_t  HEX16 = 0;    // число 16-е из символа
      uint32_t exp16 = 1;    // степень числа 16
      int32_t  dec32 = 0;    // число 10-е расчитанное со знаком

      StrControlHex.remove(0, 2);           //отрезаем управляющие символы (2шт)
      int i = StrControlHex.indexOf('|');   //определяем дилнну строки
      if (i == -1) return 0;               //фигня пришла а не 4 байта
      if (i > 8)   return 0;               //фигня пришла а не 4 байта
      StrControlHex.remove(i, 1);          //отрезаем управляющие символы ('|')

      for (int j = StrControlHex.length() - 1; j >= 0; j--) {

        HEX16 = StrControlHex.charAt(j);

        if (HEX16 >= 48 && HEX16 <= 57) HEX16 = map(HEX16, 48, 57, 0, 9);
        if (HEX16 >= 65 && HEX16 <= 70) HEX16 = map(HEX16, 65, 70, 10, 15);
        if (HEX16 >= 97 && HEX16 <= 102) HEX16 = map(HEX16, 97, 102, 10, 15);

        dec32 = dec32 + HEX16 * exp16;
        exp16 = exp16 * 16;
      }
      return dec32;                         //возвращаем десятичное число int32_t со знаком
    }
     
  19. DetSimen

    DetSimen Гуру

    Не знаю, толи смияцца, толи плакать...
     
    parovoZZ нравится это.
  20. Asper Daffy

    Asper Daffy Иксперд

    Вот сколько раз зарекался не смотреть неполные коды - только время терять!

    Кто ж мог знать, что тут такая ахренительная функция преобразования.

    Я ахреневаю просто :)
     
    DetSimen нравится это.