Принятие чисел через COM-порт.

killerrok
Offline
Зарегистрирован: 10.03.2015

В программе, необходимо ввести число, например расстояние, которое должен проехать робот. Проблема в том, что функция Serial1.read() принимает посимвольно. 

Не могли бы подсказать как принимать числа, к примеру число 125? А то в голову лезут слишком странные пути решения этой проблемы.

killerrok
Offline
Зарегистрирован: 10.03.2015

На данный момент функция чтения параметров (дальность, угол поворота) выглядит следующим образом:




void readParam()
{
 
  String text ="\rEnter parametr: "; 
  Serial1.print(text);
 
  delay(5000);
 
  counter = Serial1.read() - '0';
 
  text = "\r";
  Serial1.print(text);
 
}

 

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Можно Serial.parseInt, Serial.parseFloat использовать.

А можно считать как строку и выполнить atoi

killerrok
Offline
Зарегистрирован: 10.03.2015

Penni пишет:

Можно Serial.parseInt, Serial.parseFloat использовать.

А можно считать как строку и выполнить atoi

А можете привести какой-нибудь пример? Например, с той же строкой и atoi.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Используйте Serial.parseInt с ним проще будет чем с атои. Или гляньте поиском, в какой-то теме я уже кидал подобные куски. Вечером если время будет, накидаю

Anabelle
Offline
Зарегистрирован: 10.03.2015
Можно так:
void readParam()
{
int tmp=0;
tmp*=10;                          //смещаем на десяток каждый раз (начинаем с нулевого, т.е. 0-9)
tmp+=Serial.read()-48;  //загружаем принятое число (минус код "0")
}

только обнулять не забывайте)

killerrok
Offline
Зарегистрирован: 10.03.2015

Anabelle пишет:

Можно так:
void readParam()
{
int tmp=0;
tmp*=10;                          //смещаем на десяток каждый раз (начинаем с нулевого, т.е. 0-9)
tmp+=Serial.read()-48;  //загружаем принятое число (минус код "0")
}

только обнулять не забывайте)

А можно это загнать в цикл, к примеру while? Чтобы ждать нажатия Enter или Space?

killerrok
Offline
Зарегистрирован: 10.03.2015

Penni пишет:

Используйте Serial.parseInt с ним проще будет чем с атои. Или гляньте поиском, в какой-то теме я уже кидал подобные куски. Вечером если время будет, накидаю

Большое спасибо, спасли меня. Данная функция отлично работает. Так что, можете пример не писать.

Anabelle
Offline
Зарегистрирован: 10.03.2015

Думаю, ответ уже не требуется?)
Только вопроса, если честно, не поняла.. Что вы хотите начать делать по сигналу "Enter"? Просто само получение этого сигнала по ком порту обрабатывать не просто..)
Может кому надо будет, сама просто недавно узнала как же это сделать:
Просто как пришли какие-то данные (Serial.available>0) начинаем чтение (лучше в отдельную переменную).. Если данные закончились, записываем куда надо их и со спокойной душой обнуляем.
И еще не забываем, что скорость передачи данных com порта (если 9600) меньше скорости обработки контроллером данных (если только у вас не цикл на несколько страниц), так что чтобы контроллер не сидел без дела, пока мы посылаем байт инфы, следует организовать небольшую задержечку..

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

tmp+=Serial.read()-48;  //загружаем принятое число (минус код "0") равно

tmp+=Serial.read()-'0';  //загружаем принятое число (минус код "0")

Anabelle
Offline
Зарегистрирован: 10.03.2015

Да, одно и то же)) я писала быстро, на свой манер)

killerrok
Offline
Зарегистрирован: 10.03.2015

Anabelle пишет:

Думаю, ответ уже не требуется?)
Только вопроса, если честно, не поняла.. Что вы хотите начать делать по сигналу "Enter"? Просто само получение этого сигнала по ком порту обрабатывать не просто..)
Может кому надо будет, сама просто недавно узнала как же это сделать:
Просто как пришли какие-то данные (Serial.available>0) начинаем чтение (лучше в отдельную переменную).. Если данные закончились, записываем куда надо их и со спокойной душой обнуляем.
И еще не забываем, что скорость передачи данных com порта (если 9600) меньше скорости обработки контроллером данных (если только у вас не цикл на несколько страниц), так что чтобы контроллер не сидел без дела, пока мы посылаем байт инфы, следует организовать небольшую задержечку..

До того как мне рассказали о волшебной функции, было в планах считывать числа до нажатия Enter. Типо getchar'a. Как только пользователь нажал Enter, то программа должна была переходить к выполнению следующего за циклом кода.

Ну например:

while ( counter != ' \n ') 
{
    delay(2000);
    counter = Serial1.read();
}

Понятно, что в таком случае, переменная counter должна быть массивом.

Прошу особо не пинать за возможные косяки и ошибки, программирую не особо давно :-) 

 

И ещё такой вопрос, как сделать нормальный переход на следующую строчку?

Хочется: 

String text = " List: \n 1. Forward \n 2.Backforward \n 3.Left \n 4.right " ;

Но к сожалению, получается некоторая табуляция. Результаты смотрю через putty.