roboforum.ru

Технический форум по робототехнике.
Текущее время: 20 апр 2025, 23:24

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Странности с Serial или как преобразовать строку в число
СообщениеДобавлено: 22 авг 2011, 15:23 
Не в сети

Зарегистрирован: 16 июл 2011, 17:55
Сообщения: 24
Здравствуйте.
2 дня бьюсь над одной загадкой:
Требуется собрать входящие байты в одно целое число.

Вводим, к примеру 123

Вариант № 1:

char incoming;
char str[4];
int i=0;
void setup() {
Serial.begin(9600);
}
void loop() {
i=0;
while (Serial.available()) {
incoming = Serial.read();
if (incoming < '0' || incoming > '9') break;
str[i] = incoming;
i++;
// Serial.println(i);
}
if (i != 0)
{
str[i] = 0;
Serial.println(atoi(str));
}
}

Результат:
1
2
3



Вариант № 2:

char incoming;
char str[4];
int i=0;
void setup() {
Serial.begin(9600);
}
void loop() {
i=0;
while (Serial.available()) {
incoming = Serial.read();
if (incoming < '0' || incoming > '9') break;
str[i] = incoming;
i++;
Serial.println(i);
}
if (i != 0)
{
str[i] = 0;
Serial.println(atoi(str));
}
}

Результат:
1
2
3
123


Внимание! во втором примере итоговый результат выводимый Serial.println(atoi(str)); правильный!
Каким образом Serial.println(i); влияет на результат?
Мужики помогите! Уже все мозги сломал.
Заранее благодарен!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странности с Serial или как преобразовать строку в число
СообщениеДобавлено: 22 авг 2011, 16:06 
Не в сети
Аватара пользователя

Зарегистрирован: 10 дек 2010, 13:16
Сообщения: 4995
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей
Вероятно пока ты выводишь символ в порт у тебя успевает прилететь второй и третий байты, поэтому у тебя while три раза проходит и потом один раз выполняется Serial.println(atoi(str)); В первом же случае у тебя Serial.println(atoi(str)); выполняется три раза.

_________________
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странности с Serial или как преобразовать строку в число
СообщениеДобавлено: 22 авг 2011, 22:43 
Не в сети
Аватара пользователя

Зарегистрирован: 29 апр 2011, 12:37
Сообщения: 1672
Откуда: Москва
прог. языки: С
ошибка в логике программы,
while (Serial.available()) { отработает только один раз, т.к. скорость передачи данных много меньше скорости обработки этого цикла

фактически у вас
while (1) {
while (Serial.available()>0) {
...
}
print
}


Почитайте внимательно что возвращает Serial.available()

Исправить очень просто, если в нужном месте ещё проверять на количество принятых байт.

_________________
R3 forum87/topic15337.html
R2 roboforum.ru/forum102/topic13980.html
R4 roboforum.ru/post336339.html#p336339
Делать надо хорошо - плохо получится само!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странности с Serial или как преобразовать строку в число
СообщениеДобавлено: 22 авг 2011, 22:54 
Не в сети
Аватара пользователя

Зарегистрирован: 16 май 2009, 12:50
Сообщения: 1530
Откуда: Россия
прог. языки: Java, C
Короче надо так.
Код:
if (Serial.available()>0)
{
  delay(5);
  serAva = Serial.available();
  for (i=0; i<serAva; i++)
    inputBytes[i] = Serial.read();

  inputBytes[i] = '\0';
  serial.println(atoi(inputBytesPtr));
}

_________________
"There is nothing better than sliding down snow and flying through the air" (с) Shane McConkey.
Lieber ein Brett am Fuß als eins vorm Kopf, aber lieber ein Brett vorm Kopf als zwei am Fuß.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странности с Serial или как преобразовать строку в число
СообщениеДобавлено: 22 авг 2011, 23:02 
Не в сети
Аватара пользователя

Зарегистрирован: 29 апр 2011, 12:37
Сообщения: 1672
Откуда: Москва
прог. языки: С
Ну сейчас все блеснут своими знаниями :)))
Может устроим соревнование запустить оригинальную программу с минимальными изменениями?
По моим расчётам нужно дописать пять символов xx xxx в нужное место, но я не стал указывать своё решение, а подсказал в чём проблема, чтобы вызвать у автора вдохновение.
Вариантов много.

_________________
R3 forum87/topic15337.html
R2 roboforum.ru/forum102/topic13980.html
R4 roboforum.ru/post336339.html#p336339
Делать надо хорошо - плохо получится само!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странности с Serial или как преобразовать строку в число
СообщениеДобавлено: 22 авг 2011, 23:29 
Не в сети
Аватара пользователя

Зарегистрирован: 16 май 2009, 12:50
Сообщения: 1530
Откуда: Россия
прог. языки: Java, C
Цитата:
По моим расчётам нужно дописать пять символов xx xxx в нужное место

Могу поспорить, что дописав "хх ххх" в любое место программы лучше не станет.
Цитата:
Ну сейчас все блеснут своими знаниями

Зато не ЧСВ, как в вашем случае.

_________________
"There is nothing better than sliding down snow and flying through the air" (с) Shane McConkey.
Lieber ein Brett am Fuß als eins vorm Kopf, aber lieber ein Brett vorm Kopf als zwei am Fuß.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странности с Serial или как преобразовать строку в число
СообщениеДобавлено: 23 авг 2011, 09:05 
Не в сети
Аватара пользователя

Зарегистрирован: 29 апр 2011, 12:37
Сообщения: 1672
Откуда: Москва
прог. языки: С
>Могу поспорить, что дописав "хх ххх" в любое место программы лучше не станет.

С этим погорячился :) уже поздно было, нужно поправить три символа и переместить одну строчку.

но и ваш способ
Код:
if (Serial.available()>0)
{
  delay(5);
  serAva = Serial.available();
  for (i=0; i<serAva; i++)
    inputBytes[i] = Serial.read();

  inputBytes[i] = '\0';
  serial.println(atoi(inputBytesPtr));
}

Считает только то что прилетит за 5 миллисекунд, на скорости 9600 ничего нового не прилетит.

>Зато не ЧСВ, как в вашем случае.
Не понял.

_________________
R3 forum87/topic15337.html
R2 roboforum.ru/forum102/topic13980.html
R4 roboforum.ru/post336339.html#p336339
Делать надо хорошо - плохо получится само!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странности с Serial или как преобразовать строку в число
СообщениеДобавлено: 23 авг 2011, 11:53 
Не в сети

Зарегистрирован: 16 июл 2011, 17:55
Сообщения: 24
Мужики! Всем спасибо! Это действительно из-за скорости обработки и соотв скорости поступления данных из порта. Я действительно не до конца разобрался с Serial.available(). Она действительно выдает только кол-во байт в буфере. В Ардуино новичек. Все переписал под свои задачи.
А задача была простая, получать с другой Ардуино значения потенциометра через Xbee и управлять мотором.
Тему можно закрывать.
Спасибо всем!

пы.сы. Кстати кому интересно, могу выложить код - попинаете немного.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странности с Serial или как преобразовать строку в число
СообщениеДобавлено: 23 авг 2011, 12:10 
Не в сети
Аватара пользователя

Зарегистрирован: 29 апр 2011, 12:37
Сообщения: 1672
Откуда: Москва
прог. языки: С
Молодец! Если ты хочешь чтобы пинали то тебя запинают :)
Лучше изучать код серьёзных проектов, где решается аналогичная задача и мотать на ус.

Собственно что нужно было изменить чтобы код заработал.

Код:
char incoming;
char str[4];
int i=0;
void setup() {
Serial.begin(9600);
}
void loop() {
while (Serial.available()) {
incoming = Serial.read();
if (incoming < '0' || incoming > '9') break;
str[i] = incoming;
i++;
// Serial.println(i);
}
if (i > 2) //на данные отводим три знака
{
str[i] = 0;
Serial.println(atoi(str));
i=0;
}
}

Но на мой взгляд это довольно криво :)
И delay лучше стараться вообще не использовать, вычислительной мощности и так мало.

_________________
R3 forum87/topic15337.html
R2 roboforum.ru/forum102/topic13980.html
R4 roboforum.ru/post336339.html#p336339
Делать надо хорошо - плохо получится само!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странности с Serial или как преобразовать строку в число
СообщениеДобавлено: 23 авг 2011, 12:38 
Не в сети

Зарегистрирован: 16 июл 2011, 17:55
Сообщения: 24
Где можно посмотреть код серьезных проектов? С удовольствием гляну!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Странности с Serial или как преобразовать строку в число
СообщениеДобавлено: 23 авг 2011, 13:03 
Не в сети
Аватара пользователя

Зарегистрирован: 29 апр 2011, 12:37
Сообщения: 1672
Откуда: Москва
прог. языки: С
контроллер хоббийных серв http://www.openservo.com/viewcvs/OpenSe ... /?root=cvs

конвертер usb->i2c http://www.openservo.com/viewcvs/OpenSe ... /?root=cvs

тут много всего https://gitorious.org/avrlib/avrlib/trees/master

Ну и так по интернету много всего разбросано, главное помнить что "всё изучено до нас" :).

_________________
R3 forum87/topic15337.html
R2 roboforum.ru/forum102/topic13980.html
R4 roboforum.ru/post336339.html#p336339
Делать надо хорошо - плохо получится само!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO