Разделение числа на отдельные цифры

Neuss
Offline
Зарегистрирован: 25.01.2016

Возникла необходимость из Serial получать числа. Их отсылает Android приложение по BT. Дальше целое число надо разделить на отдельные цифры и присвоить их переменным для дальнейшей работы. Т.е. на входе "123", на выходе 1, 2, 3. В голову пришел лишь способ через строку и subString. Однако, вместо 1, 2, 3 в переменных var1 .. var3 содержится 1, 0, 2. Откуда берется 0? Пробовал по 1 цифре выделять - всё перебирает отлично. Как только 3 операции выделения подряд - сразу появляется 0. Ниже код.

String incomingString;
String tempString;
int var1;
int var2;
int var3;

void setup() 
{
  Serial.begin(9600);
}

void loop() 
{
  if (Serial.available() > 0)
  {
    incomingString = Serial.readString();
    tempString = incomingString.substring(0, 1);
    var1 = tempString.toInt();
    tempString = incomingString.substring(1, 1);
    var2 = tempString.toInt();
    tempString = incomingString.substring(2, 1);
    var3 = tempString.toInt();
    Serial.println(var1);
    Serial.println(var2);
    Serial.println(var3);
  }  
}
lex2k
Offline
Зарегистрирован: 17.12.2015

отсылай с блютуфа не стрингом а числом и принимай как число. а потом уже деление с остатком

 

lex2k
Offline
Зарегистрирован: 17.12.2015
  16   incomingString = Serial.readString();

      поставь тут Serial.println(incomingString)  и посмотри точно ли 123 прилитает или нет

 

  17  tempString = incomingString.substring(0, 1);

 

Neuss
Offline
Зарегистрирован: 25.01.2016

lex2k пишет:

а потом уже деление с остатком

 

есть пример? напиши, пожалуйста.

Neuss
Offline
Зарегистрирован: 25.01.2016

lex2k пишет:

  16   incomingString = Serial.readString();

      поставь тут Serial.println(incomingString)  и посмотри точно ли 123 прилитает или нет

первым делом проверил. прилетает именно 123

lex2k
Offline
Зарегистрирован: 17.12.2015

123 % 10 =3

123 % 100 / 10 =2

123 / 100 = 1

вот

lex2k
Offline
Зарегистрирован: 17.12.2015

Serial.readString()

.substring(0, 1)

.toInt()

где откопал .... я этих операторов не знал

 

bad_user
Offline
Зарегистрирован: 13.11.2015

можно с помощью массива:

char array[3]={0,0,0};
int count=0;

void setup() {
 Serial.begin(9600);
}

void loop() {
  if (Serial.available() > 0)
  {
    array[count] = Serial.read();
    count++;
    if (count=4){count=0;}
        
    Serial.print(array[0]);
    Serial.print(array[1]);
    Serial.print(array[2]);
    Serial.println(" ");

  } 
}

 

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

lex2k пишет:

Serial.readString()

.substring(0, 1)

.toInt()

где откопал .... я этих операторов не знал

https://www.arduino.cc/en/Reference/Serial

lex2k
Offline
Зарегистрирован: 17.12.2015

Клапауций 322 пишет:

lex2k пишет:

Serial.readString()

.substring(0, 1)

.toInt()

где откопал .... я этих операторов не знал

https://www.arduino.cc/en/Reference/Serial

спасибо 

Neuss
Offline
Зарегистрирован: 25.01.2016
int incoming;
int var1;
int var2;
int var3;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  if (Serial.available() > 0)
  {
    incoming = Serial.parseInt();
    var1 = incoming / 100;
    var2 = incoming % 100 / 10;
    var3 = incoming % 10;
    Serial.println(var1);
    Serial.println(var2);
    Serial.println(var3);
  }
}

Спасибо! Этот метод помог)

ВладимирТ
Offline
Зарегистрирован: 15.12.2020

lex2k пишет:

123 % 10 =3

123 % 100 / 10 =2

123 / 100 = 1

вот

А если количество цифр в числе не известно?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ВладимирТ пишет:

А если количество цифр в числе не известно?

Не сообщили. Грустно. Программы не написать никак...

b707
Offline
Зарегистрирован: 26.05.2017

ВладимирТ пишет:

А если количество цифр в числе не известно?

А это интрига :) Сколько же цифр в числе 12345 ? :)

ВладимирТ
Offline
Зарегистрирован: 15.12.2020

b707 пишет:

А это интрига :) Сколько же цифр в числе 12345 ? :)

Для числа 12345 этот способ не подходит. Как и для другого нетрёхзначного числа. Есть какой-то универсальный алгоритм для любых чисел (в разумных пределах)?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Во первых читаем про atoi(), во вторых учитываем то, что string это массив char.
Т.е. к любому члену массива мы можем обратиться по его индексу и конвертировать его значение в число.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

ВладимирТ пишет:

Есть какой-то универсальный алгоритм для любых чисел (в разумных пределах)?

начинать обрабатывать с младших разрядов, остаток от деления на 10 - сохранить в выводную строку, делим на 10 и опять смотрим остаток и сохраняем и т д... Потом строку вывести в обратном порядке

ВладимирТ
Offline
Зарегистрирован: 15.12.2020

andycat пишет:

инать обрабатывать с младших разрядов, остаток от деления на 10 - сохранить в выводную строку, делим на 10 и опять смотрим остаток и сохраняем и т д... Потом строку вывести в обратном порядке

Ну я так и сделал. Думал, вдруг есть что пофеншуйнее/красивее.

ВладимирТ
Offline
Зарегистрирован: 15.12.2020

Kakmyc пишет:
Во первых читаем про atoi(), во вторых учитываем то, что string это массив char. Т.е. к любому члену массива мы можем обратиться по его индексу и конвертировать его значение в число.

Спасибо за наводку. Буду курить матчасть.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ВладимирТ пишет:

Kakmyc пишет:
Во первых читаем про atoi(), во вторых учитываем то, что string это массив char. Т.е. к любому члену массива мы можем обратиться по его индексу и конвертировать его значение в число.

Спасибо за наводку. Буду курить матчасть.

 

Можно даже так:

Sring str="12345"
int x=str[2];
Serial.print(x-48);

 

ВладимирТ
Offline
Зарегистрирован: 15.12.2020

Kakmyc пишет:

Можно даже так:

Sring str="12345"
int x=str[2];
Serial.print(x-48);

Если честно - не понял. :/

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ВладимирТ пишет:

Kakmyc пишет:

Можно даже так:

Sring str="12345"
int x=str[2];
Serial.print(x-48);

Если честно - не понял. :/

Если посмотреть таблицу символов ASCII то можно увидеть что числа начинаются с номера 48.

В качестве альтернативы:
Serial.print(x-'0');

Так понятнее ?

b707
Offline
Зарегистрирован: 26.05.2017

ВладимирТ пишет:

Если честно - не понял. :/

Какую строчку? их тут всего три...

Может стоит что-то почитать на тему, что такое коды символов и какие они в таблице ASCII

ВладимирТ
Offline
Зарегистрирован: 15.12.2020

Kakmyc][quote=ВладимирТ пишет:

 Если посмотреть таблицу символов ASCII то можно увидеть что числа начинаются с номера 48. В качестве альтернативы: Serial.print(x-'0'); Так понятнее ?

Да, спасибо.