Я посылаю список позиций сервопривода через последовательное соединение на Arduino в следующем формате
1:90&2:80&3:180
Который будет разбираться как:
servoId : Position & servoId : Position & servoId : Position
Как бы я разделить эти значения и преобразовать их в целое число?
serial
arduino-mega
string
ValrikRobot
источник
источник
Ответы:
Вопреки другим ответам, я бы предпочел держаться подальше
String
по следующим причинам:Во встроенной среде, такой как Arduino (даже для Mega с большим количеством SRAM), я бы предпочел использовать стандартные функции C :
strchr()
: поиск символа в строке C (т.е.char *
)strtok()
: разбивает строку C на подстроки на основе символа разделителяatoi()
: преобразует строку C вint
Это привело бы к следующему примеру кода:
Преимущество здесь в том, что динамическое выделение памяти не происходит; вы даже можете объявить
input
как локальную переменную внутри функции, которая будет читать команды и выполнять их; как только функция возвращается, размер, занимаемыйinput
(в стеке), восстанавливается.источник
Эта функция может использоваться для разделения строки на части в зависимости от того, что символ разделяет.
Преобразовать строку в int
Этот кусок кода берет строку и разделяет ее на основе заданного символа и возвращает элемент между разделяющим символом
источник
Вы можете сделать что-то вроде следующего, но, пожалуйста, примите во внимание несколько вещей:
Если вы используете
readStringUntil()
, он будет ждать, пока не получит символ или тайм-ауты. Таким образом, с вашей текущей строкой последняя позиция будет длиться немного дольше, так как она должна ждать. Вы можете добавить трейлинг,&
чтобы избежать этого тайм-аута. Вы можете легко проверить это поведение на своем мониторе, попробовать отправить строку с дополнительным значением и без него,&
и вы увидите такую задержку.Вы на самом деле не нужен индекс серво, вы можете просто отправить строку позиций, и получить индекс серво по позиции значения в строке, что - то вроде:
90&80&180&
. Если вы используете сервоиндекс, возможно, вы захотите проверить его (преобразовать вint
, а затем сопоставить индекс цикла i), чтобы убедиться, что с вашим сообщением все в порядке.Вы должны убедиться, что возвращаемая строка
readStringUntil
не пуста. Если время ожидания функции истекло, вы не получили достаточно данных, и поэтому любая попытка извлечь вашиint
значения приведет к странным результатам.источник
Вы можете использовать
Stream.readStringUntil(terminator)
передачу другого терминатора для каждой части.На каждой части вы затем позвоните
String.toInt
источник
Самое простое решение - использовать sscanf () .
Это дает следующий вывод:
Ура!
источник
invalid conversion from 'int' to 'char*' [-fpermissive]
Смотрите пример по адресу: https://github.com/BenTommyE/Arduino_getStringPartByNr
источник
источник
jfpoilpret предоставил отличный ответ для разбора последовательной команды на Arduino. Однако у Attiny85 нет двунаправленного серийного номера - необходимо использовать SoftwareSerial. Вот как вы переносите тот же код для Attiny85
Attiny85 схемы для номеров выводов
Эскиз компилируется в:
Таким образом, есть много места и памяти для остальной части кода
источник
Arduino
ключевые слова и иногда попадают в очень сложные ситуации, поскольку внедрение кода Arduino в Attiny не всегда тривиально. Пришлось конвертировать оригинальный код для работы на Attiny, протестировал его работоспособность и решил поделиться имисточник
источник
Вот метод Arduino для разбиения строки в качестве ответа на вопрос «Как разбить строку в подстроке?» объявлен дубликатом настоящего вопроса.
Задача решения - проанализировать серию позиций GPS, записанных в файл SD-карты . Вместо того, чтобы получить строку, полученную из
Serial
, строка читается из файла.Функция
StringSplit()
разбирает строкуsLine = "1.12345,4.56789,hello"
на 3 строкиsParams[0]="1.12345"
,sParams[1]="4.56789"
&sParams[2]="hello"
.String sInput
: входные строки для анализа,char cDelim
: символ разделителя между параметрами,String sParams[]
: выходной массив параметров,int iMaxParams
: максимальное количество параметров,int
: количество проанализированных параметров,Функция основана на
String::indexOf()
иString::substring()
:И использование действительно просто:
источник