странные данные через ком
- Войдите на сайт для отправки комментариев
Пт, 20/07/2012 - 10:02
Есть два ардуино подключенные через комп порт . Нужно передавать с 1 на 2 два параметра температуру и скорость.
Чтоб не заморачиваться с массивами(пака не разобрался в них) передаю первый параметр как 10-24 второй как 25-30. Получается у меня в ком порт идут два числа. чередуясь. Пока проверяю на потенциномерах. Иногда все работает нормально независимо друг от друга и аногда при изменении данных на 1 из потенциномеров меняются и на втором. Из-за чего это может быть?? И еще сталкнулся с проблемой при добавлении в команду Seril.print значения ln на принимающем устройстве появляется еще два числа , идет чередования мое число, 1 левое, 2 левое и опять по кругу с моего .
Что бы хоть как-то и кто вам мог помоч, нужно выкладывать код принимающем и передающей дуины и желательно не куски кода, а весь код.
И еще сталкнулся с проблемой при добавлении в команду Seril.print значения ln на принимающем устройстве появляется еще два числа , идет чередования мое число, 1 левое, 2 левое и опять по кругу с моего .
Это не проблема так как функция "Seril.println()" после отправки посылаемых данных еще в конце отсылает символ перехода на новую строку и символ сдвига коретки в начало строки.
это передатчик если в буквенном видде передаю цифро то белее менее нормально если непосредственно значения вал то вообще хрен пойми что
это приемник. получается у меня на приемнике 1 потенциномер 10-25 второй 27-40. Иногда норм показывает иногда второй потенциномер меняет значение вмести с 1 и наоборот
это приемник. получается у меня на приемнике 1 потенциномер 10-25 второй 27-40.
А на передатчике не получается. Там у вас один 0-20, а второй 40-11. То есть в интервале 11-20 у вас они пересекаются значениями. Строка 17-ть первого скетча.
спасибо не заметил счас проверю. просто вчера из-за торможения менял значения исправлю скину результат
код передатчика если в ком порт смотреть то шлет все как задано
приемник если 2 потенциномера до конца выкручены показывает 237 на первом и 239 на втором . В обратную сторону 1 на первом и 219 на втором
еще ка вариант я брал I отнимал от него число чтоб на втором устройстве получился 0 а потом прибовлял данные потенциномера
с таким кодом передатчика работает. но через время начинает тупить как описано свыше
Как минимум строка 18-ть явно взята из какого-то примера без понимания "зачем она нужна и что она делает". Закоменченная 19-ть, раз данные передаются в бинарном виде, была-бы более уместная.
Да и "показывает 237 на первом и 239 на втором", вызвает сомнения. Не может, после строк 21,22, значения валов быть больше 15-ти.
Сделайте там Serial.print-ты валов, выяните что-же у вас в итоге получилось. Локализируйте в чем у вас проблема в "передаче-приему", в последующей конвертации или в "выводе на экран".
Update: упоминаемые строки относятся к скетчу в msg#10
еще ка вариант я брал I отнимал от него число чтоб на втором устройстве получился 0 а потом прибовлял данные потенциномера
Ну вариаций нафантазировать можно много. Любая задача имеет много решений. Например маппить значения в интервал от 1-126. А, потом для второго умножать на -1. Тогда на "принимающей" будеть проще разобратся - больше нуля - значит данные первого, меньше нуля - данные второго.
Хотя ваш сам подход (бить на диапазоны) "немного коряв". Но, должен признать, показывает наличие "соображалки", способность (и желание) выкручиватся в рамках имеющихся знаний. Так что, с учебными целями, стоит "дожать его", а потом поищем более "красивые варианты".
на сколько мне кажется она переводит в десятичную систему исчесления. проста раньше все принтами передавал не помню откуда 19 нарисовалась. Вроде валы очухались но всплыла другая проблема я не могу выводить вал 1 и вал 2 на экран приемника . на приемники уже 11-30 и 31-50и приравнены к 0-15 но почемуто на экране 5110 данные скачут хотя в ком порте приемника все как надо.
про пример вы правы джереми переводил в десятичную
В дальнейшем, пожалуста, вставляйте коды передатчика и приемника в одно сообщения. А то вы их чередуете и трудно следить какой передатчик с каким приемником используете.
Что-бы ветка не превращалась в "простыню", можно, при вставке кода, на вкладке "Дополнительно" отмечать галочку "свернуть".
на сколько мне кажется она переводит в десятичную систему исчесления.
Неверно (хотя ход мысли правильный) . "Системы исчисления" это вообще "человеческая фишка". В байтах все хранится/передается просто "как значение", как "абстрактная число". Переводить в "системы исчисления" это уже когда человеку нужно "показть". Это не более чем "форма записи какого-то числа".
Теперь вернемся к тому что же делает это строка: когда вы в сериал мониторе, руками вводите цифру 0 или 1, то дуине отправлеется не "байт со значением 0 или 1", а "код символа 0 или 1" в кодировке ascii (то есть фактически "строка"). Коды символа 0 это 48. 1 - 49, 2- 50. Вот для того что-бы перевести такую "код в цифру" и используются подобные строки.
Если же в сериал изначально уже был отправлено "чистое значение", то обратно "переводить" его уже не нужно. Только "прочитать".
проста раньше все принтами передавал не помню откуда 19 нарисовалась.
Ну откуда-бы не нарисовалась, а но именно "тупой read()" соотвествует "тупому write()" на передатчике.
Вроде валы очухались но всплыла другая проблема я не могу выводить вал 1 и вал 2 на экран приемника .
Значит "дробите задачу", выкидывайте всю свою "принимающую логику". Тупо напишите в скетче val1=8; val2=12; И попытайте вывести на экран.
То о чем я и говорил вам в соседней ветке. Вначале осваиваем "простые кубики", а уж потом из них собираем что-тот более сложное. Не нужно было лезть в задачу "принимать данные по сериал и выводить на экран", если задачу "выводить на экран" еще не умеем решать.
Задачу "принимать", по вашим словам вы уже "решили", задачу "выводить" - еще нет. Решите, отдельно "выводить", а уж потом беритесь за "принимать и выводить".
Не знаю нормально ли у вас работает lcd.setCursor, но попробуйте так:
В дальнейшем, пожалуста, вставляйте коды передатчика и приемника в одно сообщения. А то вы их чередуете и трудно следить какой передатчик с каким приемником используете.
Что-бы ветка не превращалась в "простыню", можно, при вставке кода, на вкладке "Дополнительно" отмечать галочку "свернуть".
Дело в том что так и делал сразу попробовал выводить часы и просто данные а счас перешол на ком порт но пока что то не выходит буду пробовать дальше
СПАСИБО ПОМОГЛО!!!!!!! Единственноестрока 16. 1 и0 поменять местами строка это второе значение.
Нук и напоследок еще вопрос у меня счас на экране нокиа 5110 6 строк . Для того чтоб была например 4 или 3 ну или тока 2 больших знака что надо сделать ??? Поменять библиотеку???
Может и эта библиотека может выводить большие символы... ну а если не может, то погуглите, думаю уже такие библиотеки есть.
Вот так можно делать - это на будущее
Передатчик:
Приемник:
Ничего сложного.
1 строка - что с ней можно сделать???
про 2 я уже понял и писал.
3 и 4 я перевожу то что получаю чтоб на экране ардуины видеть данные 1 и 2 потенциномеров 0-15
Я понял что счас оно немного не на том месте.
По поводу 1 строки, смтрите выше в коде.
В 3 и 4 строке вы обЪвляете переменные int val и int val2 и никуда вы их не выводите... а что бы получать нужный вам диапазон нужно просто его отправлять таким, каким вам нужно.
И еще заметил только сейчас, в 6 строке зачем вы отправляете обратно значение, которое только что получили?
6 строку смотрю но ком порте компа я видел что они не переводятся просто надо переставить
.... я видел что они не переводятся просто надо переставить
кто не переводятся? кого переставить?
значения вал сча не используются
Так а не проще их такими сразу отправлять?
это строки из передающего кода.
Передающая:
Принимающая:
там опечатка они обао 0-15 они должны быть независимы друг от друга . счас получается ервая 11-30 вторая 31-50 и потом в приемнике обе к 0-15
Эти два байта всегда будут независимы друг от друга, потом просто поменяете в передающем коде
и все.
понял спасибо попробую. а смысл тогда передавать массивами если можно так?? просто мне говорили что мою задачю тока массивом можно решить
поменял коды как вы советовали убрал лишнее все нормально . не подскажите что можно сделать с 1 строкой в которой прога висит возможно из-за этого xbee тока в 1 сторону работает
while( Serial.available() == 0);
Скорее всего из-за этого и не работат потому что пока в буфере UART пусто программа крутится в пустом цикле и ничего не делает. Вы идете как бы от обтатного, то есть пока Serial.available() == 0 - цикл. Я вам предлагаю сделать наоборот пока Serial.available() == 1 - цикл, в котором происходит чтение. Вы же видите как в моих примерах это реализовано.
Ваш способ:
Мой способ:
В среде дуины эти записи эквивалентны:
Выше я вам уже код писал (код с комментариями), единственное я там одну скобку забыл поставить }
вот еще раз:
у меня получается что данные идут каждые пол секунды в порт.ил это никак не влияяет???
поменял 0 на 1 стали показывать вмест 11-30 115-290 но на мотенциномер нормально реагирует. а блин это теже 11-30(29) тока откудато в конце 5 нарисовалась. Так какаято левая хрень была поубирал. все работает
Я вас не понимаю, выражайтесь яснее, что и где меняете.... что и где меняется....
Просто у меня на экране вместо показаний потенциномера еще была цифра 5 (не 11 а 115 и так далее)после каждого показания но это косяк экрана был я все убрал. меня интересует как организовать двусторонню связь чтоб я мог с приемника отправлять на ередатчик не мешая работе связке передатчик приемник
Я думаю XBEE без проблем будет "одновременно" принимать и отправлять данные. Все дело в вашем коде. А сделать это можно по аналогии в принимающий код добавить часть кода передающего, а в передающий добавить часть принимающего.
получается грубо говоря я принял 1 байт вывел в экран передал инфо по xbee потом прочитал второй байт и так далее и с той стороны тоже самое???