Проблема получения данных с серийного порта Arduino
- Войдите на сайт для отправки комментариев
Доброго время суток!
Работаю над небольшим проектом мониторинга состояний окружающей среды... Он состоит из 4-х Ардуин, 3 из которых занимаются сбором данных с различных сенсоров и по запросу передают по серийному порту на 4-ую Ардуину. Данные с сенсоров по серийному идут в формате состоящем из 2-4 чисел (в зависимости от датчика). Например "1234" без лишних запятых, букв и тд. Идут они раздельно с интерввалом в 5 секунд. Задача состоит в том чтоб считать эти данные также раздельно и целиком а не по-битно... Т.к. данные я получаю, но лишь один бит из нескольких в формате ASCII. Я перерыл весь интернет, перепробывал кучу всяких кодов, но все никак...может кто-то сталкивался или может помоч?
Заранее благодарен!
Вот пример кода:
Serial.write('R'); //запрашиваем данные с датчика дождя
if(Serial.available() > 0)
{
rain = Serial.read(); //считываем данные
delay(50);
lcd.setCursor(-4, 2); //выводим на дисплей
lcd.print("Rain: ");
lcd.print(rain);
lcd.print(" ");
delay(50);
dataString += "\nrain,"; //отслылаем на сервер Pachube.com
dataString += rain;
}
delay(2000);
З.Ы. Данные с датчиков приходят в нормальном виде, но не распознаются правильно уже самой Ардуиной. Проверено используя Tera Term терминал напрямую к серийному порту 4-ой Ардуины...
Все от того что не понимаете разницы между типами данных, а отсюда не знаете что ищите. Плюс ко всему из вашего обгрызка кода не ясно в каком виде вы пытаетесь принять данные.
http://arduino.ru/forum/programmirovanie/upravlenie-servoprivodom-po-serial
Данные отсылаются скорее всего в ASCII... отсылаются с 1ой Ардуины на 4ую при помощи команды:
Serial.println(sens_temp); //к примеру, где sens_temp = 1204
На другом конце принимаются в таком же виде "1204", проверено при помощи монитора серийного порта. Но самой ардуиной не получаются они целым числом. Пробовал и в массив загнать и Serial.readBytesUntil() функции и все никак...
Что не понятно из #1 поста?
Да чесное слово многое... посмотрел я ту ветку на форуме и всеравно нечего не получается. У меня немного другой случай или я что-то делаю не так
Случай у вас именно тот.
Уже пробовал, но не получилось через данный метод... Но уже разобрался используя другой подход. И все славо богу заработало. Осталось с делэями разобраться, некоторые данные иногда проскакивают и залазят на место данных следующего датчика.
Вот собвственно сам метод:
delay() -тут вообще не очень понятно зачем. Не заработало - скорее всего Максим опечатался в lcd.setCursor(-4, 2);
Откуда отрицательные координаты курсора?
А "данные" у вас скорее всего не "проскакивают и залазят", а просто "остаются на экране".
Смотрите, предположим, я выведу в левый верхний угол экрана цифру
"12345"
А потом, через какое-то время, опять сделую lcd.SetCursor(0,0) и выведу "678".
Что будет на экране? 678? Не-а. Раз я вывел только три символа, то только три символа и "поменяеются" (затрут старое значение). А что они "не покрыли", то и останется на экране. В итоге я увижу
"67845"
Что скорее всего вы и обозвали "проскочило".
Что-бы старые цифры стали не видны, нужно их "затереть", ну хотя-бы пробелами. Я должен был сделать что-то типа
Тогда я на экране увижу "678" и "12345" уйдет целиком и полностью.
Либо, как вариант. Я мог перед выводом 678, вывести строку пробелов, что-бы очистить первую строку целиком:
Но... визуально это может выглядить "неприятно". Как бы "мигание". Вывод целой строки - это немного медленно.
Но уже разобрался используя другой подход.
Вот собвственно сам метод:
Не заработало - скорее всего Максим опечатался в lcd.setCursor(-4, 2);
Не заработало - скорее всего Максим опечатался в lcd.setCursor(-4, 2);
А я, в 80% случае, не вставленный нормально код - вообще не смотрю :) Так что "-4" впервые увидел в вашем сообщении. Опечатался, процитировал чужой код и не заметил - какая разница? :) В любом случае понятно что сознательно вы такого бы не написали. Хотя я сильно и не вникал, но как мне помнится в библиотеке же вроде нет relative координат? Вроде только absolute были.
delay() -тут вообще не очень понятно зачем. Не заработало - скорее всего Максим опечатался в lcd.setCursor(-4, 2);
Откуда отрицательные координаты курсора?
Все тут хорошо... просто некоторые китайские дисплеи 16 на 4 строки имеют такую проблему как отрицательную координату... иначе не работает! Поэтому делаем как работает. Это просто возможно из-за того что библиотека и большинство контроллеров для ЖД идут для 16х2, а не 16х4... Но углубляться более в эту проблему с отр. кординатами нет времени...
А насчет затирки все понятно и все уже учтено, но не в выше упомянутом коде.
Не заработало - скорее всего Максим опечатался в lcd.setCursor(-4, 2);
А я, в 80% случае, не вставленный нормально код - вообще не смотрю :) Так что "-4" впервые увидел в вашем сообщении. Опечатался, процитировал чужой код и не заметил - какая разница? :) В любом случае понятно что сознательно вы такого бы не написали. Хотя я сильно и не вникал, но как мне помнится в библиотеке же вроде нет relative координат? Вроде только absolute были.
Все тут правильно с отр. знаком. Просто библиотеки писались под 16на2 и 20на4... а уже после начали производить 16на4... следовательно используя дисплей на 4 строки нужно учитывать сдвиг на 4 знака... так как библиотека на 20 знаков и 4 строки. Можно переписать или поискать другую библиотеку, но зачем? Если все работает!
Но уже разобрался используя другой подход.
Вот собвственно сам метод:
Почему вы так считаете? Просто упрощать код времени нет... А ваши и другие методы не прокатили в моем случае. А этот работает как ни страно. Всеравно спасибо вам. В другой раз будет больше времени обязательно разберусь и доведу код.
Да и все как-то привязались к выводу на дисплей данных, а не вывода данных с серийного порта. Проблем с выводом на экран то и небыло.
У вас не заработало потому что вы не смогли правильно воспользоваться тем что вам дали, а огрызок он от того что нужно показывать весь код, что бы можно было как то видеть что у вас там не так.
У вас не заработало потому что вы не смогли правильно воспользоваться тем что вам дали, а огрызок он от того что нужно показывать весь код, что бы можно было как то видеть что у вас там не так.
Возможно, спорить не буду! Времени мало чтобы разбераться.
А насчет огрызка вы правы, извеняйте. Не опытен в этих делах. До этого не приходилось на форуме обращаться за помощью, все находилось в просторах интернета.
И вот вам полноценный код:
2-ого пункта сбора данных из 3-х (остальные два по такому же принципу):
и код самого сервера сбора данных с которым были проблемы: