Разделение числа на отдельные цифры
- Войдите на сайт для отправки комментариев
Пнд, 25/01/2016 - 22:31
Возникла необходимость из 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);
}
}
отсылай с блютуфа не стрингом а числом и принимай как число. а потом уже деление с остатком
16 incomingString =Serial.readString();поставь тут
Serial.println(incomingString) и посмотри точно ли 123 прилитает или нет17tempString = incomingString.substring(0, 1);а потом уже деление с остатком
есть пример? напиши, пожалуйста.
16 incomingString =Serial.readString();поставь тут
Serial.println(incomingString) и посмотри точно ли 123 прилитает или нетпервым делом проверил. прилетает именно 123
123 % 10 =3
123 % 100 / 10 =2
123 / 100 = 1
вот
Serial.readString().substring(0, 1)
.toInt()
где откопал .... я этих операторов не знал
можно с помощью массива:
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(" "); } }Serial.readString().substring(0, 1)
.toInt()
где откопал .... я этих операторов не знал
https://www.arduino.cc/en/Reference/Serial
Serial.readString().substring(0, 1)
.toInt()
где откопал .... я этих операторов не знал
https://www.arduino.cc/en/Reference/Serial
спасибо
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); } }Спасибо! Этот метод помог)
123 % 10 =3
123 % 100 / 10 =2
123 / 100 = 1
вот
А если количество цифр в числе не известно?
А если количество цифр в числе не известно?
Не сообщили. Грустно. Программы не написать никак...
А если количество цифр в числе не известно?
А это интрига :) Сколько же цифр в числе 12345 ? :)
А это интрига :) Сколько же цифр в числе 12345 ? :)
Для числа 12345 этот способ не подходит. Как и для другого нетрёхзначного числа. Есть какой-то универсальный алгоритм для любых чисел (в разумных пределах)?
Во первых читаем про atoi(), во вторых учитываем то, что string это массив char.
Т.е. к любому члену массива мы можем обратиться по его индексу и конвертировать его значение в число.
Есть какой-то универсальный алгоритм для любых чисел (в разумных пределах)?
начинать обрабатывать с младших разрядов, остаток от деления на 10 - сохранить в выводную строку, делим на 10 и опять смотрим остаток и сохраняем и т д... Потом строку вывести в обратном порядке
инать обрабатывать с младших разрядов, остаток от деления на 10 - сохранить в выводную строку, делим на 10 и опять смотрим остаток и сохраняем и т д... Потом строку вывести в обратном порядке
Ну я так и сделал. Думал, вдруг есть что пофеншуйнее/красивее.
Спасибо за наводку. Буду курить матчасть.
Спасибо за наводку. Буду курить матчасть.
Можно даже так:
Можно даже так:
Если честно - не понял. :/
Можно даже так:
Если честно - не понял. :/
Если посмотреть таблицу символов ASCII то можно увидеть что числа начинаются с номера 48.
В качестве альтернативы:
Serial.print(x-'0');
Так понятнее ?
Если честно - не понял. :/
Какую строчку? их тут всего три...
Может стоит что-то почитать на тему, что такое коды символов и какие они в таблице ASCII
Если посмотреть таблицу символов ASCII то можно увидеть что числа начинаются с номера 48. В качестве альтернативы: Serial.print(x-'0'); Так понятнее ?
Да, спасибо.