1. В сообществе нашего форума Вконтакте создан раздел по продаже электронных компонентов.
    Каждый может продать в нем свои залежавшиеся детали. Подробности здесь.

не работает toLowerCase

Тема в разделе "Arduino", создана пользователем fusic, 9 фев 2017.

  1. fusic

    fusic Гость

    Сообщения:
    2
    Симпатии:
    0
    Доброго дня!
    связал ардуино мега с компом.
    ардуина должна выполнять команды типа запись в PWM, чтение портов и т.д.
    Передаю команду в виде строки, ардуино разбирает её на команду (cmd) и параметр\аргумент (prmStr)
    В процессе рабора использую cmd.toLowerCase();
    для отладки передаю выделенную команду обратно в комп.
    Проблема в том что не все буквы переводятся в нижний регистр.
    Например строка QWERTYUIOPASDFGHJKLZXCVBNM после перевода в нижний регистр
    вернётся строкой qwertYUioPASDfGHjKlZxcVBNM
    В чем проблема, куда копать ?
    Но это ещё не всё!
    Выделяю из строки параметр (он заключен в квадратные скобки) и перевожу его в целое число prm
    int prm = prmStr.toInt();
    Эта функция то же воспринимает не все цифры
    воспринимает 1, 2, ...
    не воспринимает 0, 3, ...
    поэтопу получаю не правильный параметр
    например передаю PWM1[2202]
    должен получить pwm1 и 2202
    реально получаю PwM1 и 22 (доходит до первой 'невоспринимаемой цифры' и дальше обрезает)

    PHP:
    String inStr "";
    void setup() {
      
    Serial.begin(9600);
      while (!
    Serial); // wait for serial port to connect. Needed for native USB port onl
    }
    void loop() {
      while (
    Serial.available()) {
        
    char inChar Serial.read();
         if (
    inChar == '@')
         {
           
    int cmdEnd inStr.indexOf('[');
           if (
    cmdEnd != -1) {
             
    Serial.println(cmdEnd);
             
    String cmd inStr.substring(0,cmdEnd);
             
    cmd.toLowerCase();
             
    Serial.print("Command: ");
             
    Serial.println(cmd);
           } else
             {
                
    Serial.println("ERROR");
                break;
             }
           
           
    int prmEnd inStr.indexOf(']');
           if (
    prmEnd != -1) {
             
    Serial.println(prmEnd);
             
    String prmStr inStr.substring(cmdEnd+1,prmEnd);
             
    int prm prmStr.toInt();
             
    Serial.print("Param: ");
             
    Serial.println(prm);
           } else
             {
                
    Serial.println("ERROR");
                break;
             }
         
           
    inStr "";
           break;
         } else
              {if (
    inChar != ' ')
                {
                  
    inStr += inChar;
                }
              }
        }
    }
     
  2. radioengineer

    radioengineer Администратор Команда форума

    Сообщения:
    3.489
    Симпатии:
    345
    Адрес:
    Алматы
    Интересный баг, не могу сейчас воспроизвести, т.к. нет платки под рукой, завтра на работе попробую. Пока могу только посоветовать попробовать отлавливать сообщения в другом эмуляторе терминала, может что-то прояснится.
  3. fusic

    fusic Гость

    Сообщения:
    2
    Симпатии:
    0
    да...прога на компе в Delphi 7

    за основу взял SimplePacket из демоса nrComm_Lib_Pro_v.9.27
    --- Сообщения объединены, 9 фев 2017 ---
    выяснилось что если подавать команды не из дельфи-проги а из монитора порта то всё работает замечательно

    и ещё один момент: даже если изначально передать в ардуино команду в нижнем регистре, например pwm1[134], ив процессе обработки переменная cmd примет значение "pwm1" то строка

    1if (cmd=="pwm1") {Serial.prontln("PWM1 OK")};
    не трушная, не работает ... визуально строки одинаковые .... а в результате сравнения сообщения "PWM1 OK" нет

    может с кодировками что то напутано (со стороны дельфи-проги) ?
    --- Сообщения объединены, 9 фев 2017 ---
    хотел было отказаться от символьных команд заменив их числами (хотя символьные команды были бы удобнее при написании управляющей дельфи-проги) НО половина цифр тоже не воспринимаются

    1int prm = prmStr.toInt();
    "220" превращается в целое 22 (0 не воспринимается)

    "252" превращается в целое 2 (после невоспринимаемой цифры всё обрезается)

    природа этой ошибки\проблемы одна

    1. подскажите какая кодировка в ардуино иде (может не корректно вопрос ставлю ... ну как могу) ?

    2. кодировка в дельфи-проге зависит от кодировки ОС (виндовз) ?

Поделиться этой страницей