Serial.read() число целиком

al072
Offline
Зарегистрирован: 20.04.2017

Всем доброго времени суток! Подскажите пожалуйста как прочитать число целиком в переменную int из потока Serial.read()? Если передаю в поток одну цифру "7" то switch отрабатывает нормально, а вот если передаю число "10" то в переменную inByte сохраняется только цифра "1" а цифра "0" теряется:

void setup ()
{
  //инициализируем serial порт
  Serial.begin(57600);
}

void loop ()
{
    /
     if (Serial.available() > 0) 
     {
        int inByte = Serial.read();
         switch (inByte) 
        {  
                case '7': 
                  LINE_COLOR = LINE_BLACK;
                  Serial.println("BL");                  
                  break;
                case '10': 
                  LINE_COLOR = LINE_WHITE;
                  Serial.println("WL");                  
                  break;
         }
     }
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

И чо, вот этот код компилируеца?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Мне понравилась эта строка.

19                 case '10':

 

sadman41
Offline
Зарегистрирован: 19.10.2016

см. Serial.parseInt()

al072
Offline
Зарегистрирован: 20.04.2017

DetSimen пишет:

И чо, вот этот код компилируеца?

код компилируется.

al072
Offline
Зарегистрирован: 20.04.2017

qwone пишет:

Мне понравилась эта строка.

19                 case '10':

что не так с этой строкой?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

sadman41 пишет:

см. Serial.parseInt()

Только не на нашем сайте, а на главном.
https://www.arduino.cc/reference/en/language/functions/communication/ser...

Наш справочник языка уже лет 5 не обновлялся....

al072
Offline
Зарегистрирован: 20.04.2017

sadman41 пишет:

см. Serial.parseInt()

так тоже не работает:


void setup ()
{
  //инициализируем serial порт
  Serial.begin(57600);
}
void loop ()
{ 
     if (Serial.available() > 0)
     {
        int inByte = Serial.parseInt();
        switch (inByte)
        { 
                case '7':
                  LINE_COLOR = LINE_BLACK;
                  Serial.println("BL");                 
                  break;
                case '10':
                  LINE_COLOR = LINE_WHITE;
                  Serial.println("WL");                 
                  break;
         }
     }
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

В строку 11: Serial.println(inByte); и смотреть на результат в Serial Monitor

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

al072 пишет:

что не так с этой строкой?

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

al072 пишет:

так тоже не работает:

И не должен. См. Выше.

al072
Offline
Зарегистрирован: 20.04.2017

sadman41 пишет:

В строку 11: Serial.println(inByte); и смотреть на результат в Serial Monitor

результатом является всегда первая цифра числа

sadman41
Offline
Зарегистрирован: 19.10.2016

al072 пишет:

sadman41 пишет:

В строку 11: Serial.println(inByte); и смотреть на результат в Serial Monitor

результатом является всегда первая цифра числа

Почему же у меня не так?

void setup ()
{
  //инициализируем serial порт
  Serial.begin(115200);
}
void loop ()
{
  if (Serial.available() > 0)
  {
    int inByte = Serial.parseInt();
    Serial.print("inByte: "); Serial.println(inByte);
  }
}

/*
inByte: 13
inByte: 66
inByte: 908
*/

 

al072
Offline
Зарегистрирован: 20.04.2017

sadman41 пишет:

al072 пишет:

sadman41 пишет:

В строку 11: Serial.println(inByte); и смотреть на результат в Serial Monitor

результатом является всегда первая цифра числа

Почему же у меня не так?

void setup ()
{
  //инициализируем serial порт
  Serial.begin(115200);
}
void loop ()
{
  if (Serial.available() > 0)
  {
    int inByte = Serial.parseInt();
    Serial.print("inByte: "); Serial.println(inByte);
  }
}

/*
inByte: 13
inByte: 66
inByte: 908
*/

Вообщем искал проблему не там где она должна быть, одна цифра передавалась потомучто была ошибка в функции на ПК которая писала данные в Serial, фактически она писала всегда только один байт.

теперь проблема в другом, не могу сравнить строки, передаю число например "10" в строковую переменную, но условие if(COMMAND=="10") не выполняется в чем может быть проблема?

 String COMMAND="";
while(Serial.available())
    {
       delay(10);
       char c = Serial.read();
       COMMAND+=c;
    }
    if(COMMAND.length()>0)
    {
      if(COMMAND =="10")
      {
        CONTROL = CONTROL_AUTO;
        Serial.println("CA");
        COMMAND = "";
      }          
    }

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

все что внутри знаков <> пакет. А то что снаружи мусор.

/**/
unsigned long mill;// переменная для millis()
typedef void (*pDo)() ;// тип -функция обработчик
//----------------------------------------------
const byte numBuffer = 20;
char buffer[numBuffer];
byte iBuffer = 0;
bool fBuffer = false;
//----------------------------------------------
void setup() {
  Serial.begin(9600);
}

void loop() {
  mill = millis();
  if (Serial.available() > 0) {
    char c = Serial.read();
    switch (c) {
      case '<':
        iBuffer = 0;
        fBuffer = true;
        break;
      case '>':
        if (fBuffer == true) {
          buffer[iBuffer] = 0;
          Serial.println(buffer);
          iBuffer = 0;
          fBuffer = false;
        }
        break;
      default:
        if (c >= ' ' && c <= '}' && iBuffer < numBuffer )buffer[iBuffer++] = c;
    }
  }
}
/**/

 

Nosferatu
Offline
Зарегистрирован: 04.11.2012

al072 пишет:

теперь проблема в другом, не могу сравнить строки, передаю число например "10" в строковую переменную, но условие if(COMMAND=="10") не выполняется в чем может быть проблема?

Для сравнения строк equals()

al072
Offline
Зарегистрирован: 20.04.2017

Nosferatu пишет:

al072 пишет:

теперь проблема в другом, не могу сравнить строки, передаю число например "10" в строковую переменную, но условие if(COMMAND=="10") не выполняется в чем может быть проблема?

Для сравнения строк equals()

Спасибо, equals помог...

al072
Offline
Зарегистрирован: 20.04.2017

qwone пишет:

все что внутри знаков <> пакет. А то что снаружи мусор.

/**/
unsigned long mill;// переменная для millis()
typedef void (*pDo)() ;// тип -функция обработчик
//----------------------------------------------
const byte numBuffer = 20;
char buffer[numBuffer];
byte iBuffer = 0;
bool fBuffer = false;
//----------------------------------------------
void setup() {
  Serial.begin(9600);
}

void loop() {
  mill = millis();
  if (Serial.available() > 0) {
    char c = Serial.read();
    switch (c) {
      case '<':
        iBuffer = 0;
        fBuffer = true;
        break;
      case '>':
        if (fBuffer == true) {
          buffer[iBuffer] = 0;
          Serial.println(buffer);
          iBuffer = 0;
          fBuffer = false;
        }
        break;
      default:
        if (c >= ' ' && c <= '}' && iBuffer < numBuffer )buffer[iBuffer++] = c;
    }
  }
}
/**/

 

qwon спасибо за функцию!!! Я так понял что можно в пакете слать любую команду, а потом парсить.., единственное не понял что делает кусок кода

default:
        if (c >= ' ' && c <= '}' && iBuffer < numBuffer )buffer[iBuffer++] = c;

Буду благодарен за объяснение.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

А эта строка отсекает лишние знаки . Входят толькл от пробела до скобки

al072
Offline
Зарегистрирован: 20.04.2017

qwone пишет:

А эта строка отсекает лишние знаки . Входят толькл от пробела до скобки

Большое спасибо, теперь все понятно!