Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Логирование с com  (Прочитано 4535 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Rasskazow

  • Автор темы
  • Участник
  • *
  • Сообщений: 142
    • Просмотр профиля
Логирование с com
« : 18 Февраля 2014, 20:57:24 »
Ребят привет !
Опишу в кратце.
Есть arduino подключенная в usb с автоматическим определением как com-port.
На ардуино скетч(типа скрипта) мониторинга температуры с откидывания показаний в com-port каждые секунд 10.
Всё работает в терминале, данные идут.
Пытаюсь скрипт написать - нифига не получается (((
Уже второй вечер сижу мудрю. Уже и так и сяк.
#!/bin/bash
stty -f /dev/cu.usbmodemfa121 9600 # установка параметра порта
sleep 2
raw='cat /dev/cu.usbmodemfa121'
echo $raw
В итоге хочу получить меняющуюся переменную и добавлением к ней отметок времени.
Что б было примерно так
12:24:38 25℃ >> therm.log

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Логирование с com
« Ответ #1 : 18 Февраля 2014, 21:05:02 »
raw='cat /dev/cu.usbmodemfa121'
Это в каких кавычках? Должно быть или ` (та, клавиша что Ё) или
Код: (bash) [Выделить]
raw=$(cat /dev/cu.usbmodemfa121)
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Rasskazow

  • Автор темы
  • Участник
  • *
  • Сообщений: 142
    • Просмотр профиля
Re: Логирование с com
« Ответ #2 : 18 Февраля 2014, 21:20:34 »
У меня на ё нет кавычек.
Есть на э и есть на тильде.
У меня те, что на тильде.
Есил с другими но выводом команды cat будет /dev/cu.usbmodemfa121
Почему-то не прокатывает (((
« Последнее редактирование: 18 Февраля 2014, 21:26:53 от Rasskazow »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Логирование с com
« Ответ #3 : 18 Февраля 2014, 21:26:50 »
А на Терминал Вы как данные получаете?
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Rasskazow

  • Автор темы
  • Участник
  • *
  • Сообщений: 142
    • Просмотр профиля
Re: Логирование с com
« Ответ #4 : 18 Февраля 2014, 21:30:25 »
Просто ввожу в консоли:
stty -f /dev/cu.usbmodemfa121 9600потом cat /dev/cu.usbmodemfa121И в ответ сыплются данные.
Выхожу ctrl+c.

А в bash не получается ни фига. Уже голову сломал, что делаю не так ?!

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Логирование с com
« Ответ #5 : 18 Февраля 2014, 21:35:40 »
Тут дело во времени. cat висит постоянно, и как только появляется что-то он выводит, а в скрипте срабатывает одномоментно.
Мне кажется надо логировать в какой-то файл из терминала cat /dev/cu.usbmodemfa121 > raw.logа уже из него брать переменную скриптом.
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн golota

  • Участник
  • *
  • Сообщений: 132
    • Просмотр профиля
Re: Логирование с com
« Ответ #6 : 18 Февраля 2014, 23:43:34 »
Отличная утилита для коммуникациии между роутером (или любым линуксом) и Arduino (MSP430 Launchpad)
SJinn
Очень удобна для сбора показаний датчиков с Arduino (Launchpad).
Простой, доступный интерфейс коммандной строки.
(Нажмите, чтобы показать/скрыть)
У меня,апример, на Launchpad крутится скетч читающий показания датчиков температуры, влажности и атмосферного давления.
Типа самодельная Weather station.
Цикл чтения датчиков начинается после получения символа "m" из сериального порта.
Результаты измерений передаются в тот-же порт.

# rs232 -d /dev/ttyACM0 --dtr --rts -s "m" -r32
18.2 1003.53 57.2

Скетчи, если надо,  могу поискать  :coolsmiley:
Правда года два-три назад писалось... компы менялись  :-\
Странно, что Arduino так странно определяется, всегда было   ttyACM(x)
А если чеpез l2303 converter то ttyUSB(x)
Для Arduino нужно правильно установить stty (сейчас, у меня Arduino нет, проверить не могу)
но на arduino.cc, пишут, что надо
(Нажмите, чтобы показать/скрыть)
А для MSP430 Launchpad, stty заклинание вот такое -
(Нажмите, чтобы показать/скрыть)
  :idiot2:
« Последнее редактирование: 19 Февраля 2014, 00:49:54 от golota »
Я знаю то, что ничего не знаю, но некоторые не знают и этого. Сократ

Оффлайн Rasskazow

  • Автор темы
  • Участник
  • *
  • Сообщений: 142
    • Просмотр профиля
Re: Логирование с com
« Ответ #7 : 19 Февраля 2014, 06:24:26 »
Да, вы заметили.
Я её сейчас разрабатываю за мак ос, мне просто тут удобней и быстрей, bash такой же как и ubuntu, редко чем команды отличаются.
Потом отлаживаю и проверяю в ubuntu с виртуальной машиной, уже потом хочу затолкать это всё в ubuntu server установленную на intel atom.

Пользователь решил продолжить мысль 19 Февраля 2014, 07:34:24:
golota,
За наводку на программу спасибо,
но мне лучше данные в переменную получать, без дополнительных программ.
А про скетчи интересно. Я пока только начал изучать arduino, очень много затыков, с которым разобраться не могу.
Вообще хочу что б было примерно так:
Arduino запускается и опрашивает датчики температуры, если температура в норме - ни чего не делает.
Если ниже нормы - включает определенный пин на котром реле с обогревателем.
Но проблема ещё в том, что будут датчики не только температуры, но и открытия дверей, газа. В общем, если делать опрос датчиков поэтапный - arduino может не опросить в нужный момент какой-нибудь датчик. То-есть до дверь открылась-закрылась, а arduino в этот момент выполняет другую функцию.

Ещё хочу все события слать в serial port для логирования на компьютере.
Так же из serial port в arduino слать какие-то корректирующие значения, а-ля "Поддерживай температуру на 2 градуса выше в течении часа"

Пользователь решил продолжить мысль 19 Февраля 2014, 07:34:56:
Но вот чтение из com-порта и перевод в переменную ни как не получается.
« Последнее редактирование: 19 Февраля 2014, 07:35:38 от Rasskazow »

Оффлайн golota

  • Участник
  • *
  • Сообщений: 132
    • Просмотр профиля
Re: Логирование с com
« Ответ #8 : 19 Февраля 2014, 12:02:32 »
Цитировать
мне лучше данные в переменную получать, без дополнительных программ...
чтение из com-порта и перевод в переменную ни как не получается.
Вы обязательно получите зависания.
Поверьте моему опыту, предложенаая программа (SJinn) , оптимальна для такого рода задач.

Цитировать
будут датчики не только температуры, но и открытия дверей, газа
Понятно, что-то типа "Умный дом".

Тогда, вам придётся серьёзно разобраться с системой прерываний и работой таймеров Arduino.
И практически отказаться от delay();
Некоторые датчики, могут генерировать прерывания по окончании цикла измерения.
Окрытие-закрытие - однозначно и просто прерывания.
Практически все датчики, в своих datasheet имеют значения продолжительности цикла измерения, для конкретной точности.
Тут уже нужны прерывания от таймера -
Запучтили цикл измерения датчика, занимаемся другими делами.
Получили прерывание от таймера - считали значения датчика.
На Arduino даже примитивный "multitasking" можно реализовать.

Для начала, привыкайте -
(Нажмите, чтобы показать/скрыть)
Где-то так ...
Иначе, будет полная фигня.
« Последнее редактирование: 19 Февраля 2014, 12:27:47 от golota »
Я знаю то, что ничего не знаю, но некоторые не знают и этого. Сократ

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Логирование с com
« Ответ #9 : 19 Февраля 2014, 12:48:07 »
Но вот чтение из com-порта и перевод в переменную ни как не получается.
Так а что не получается с предложенным мной вариантом? В файл raw.log пишется вывод с датчика?
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Rasskazow

  • Автор темы
  • Участник
  • *
  • Сообщений: 142
    • Просмотр профиля
Re: Логирование с com
« Ответ #10 : 19 Февраля 2014, 12:58:00 »
Azure,
Получилось вот так:
#!/bin/bash
stty -f /dev/cu.usbmodemfa121 9600 # установка параметра порта
cat /dev/cu.usbmodemfa121 | while read raw
do
echo $raw
done
В консоль естественно валятся значения температуры которые нужно поделить на 16, почему не знаю, но дополненные пробелом, что меня смущает.
Но это не самое страшное, если вместо echo $raw делаю так - echo $(($raw/16)) вываливается /16")syntax error: operand expected (error token is "Мне почему это нужно ?
В ком порт потом будет сыпаться все события из arduino, они будут разбиваться - если это датчик температуры - то один лог, влажности - другой лог.

Спасибо большое за помощь !

Оффлайн golota

  • Участник
  • *
  • Сообщений: 132
    • Просмотр профиля
Re: Логирование с com
« Ответ #11 : 19 Февраля 2014, 13:00:27 »
Arduino запускается и опрашивает датчики температуры, если температура в норме - ни чего не делает.
Если ниже нормы - включает определенный пин на котром реле с обогревателем.
Но проблема ещё в том, что будут датчики не только температуры, но и открытия дверей, газа. В общем, если делать опрос датчиков поэтапный - arduino может не опросить в нужный момент какой-нибудь датчик. То-есть до дверь открылась-закрылась, а arduino в этот момент выполняет другую функцию.

Ещё хочу все события слать в serial port для логирования на компьютере.
Так же из serial port в arduino слать какие-то корректирующие значения, а-ля "Поддерживай температуру на 2 градуса выше в течении часа"
Какой датчик температуры ? DS1820, DHT11, DHT22 или экзотика какая-то  ;)
Будет нечего делать, помогу ...
Не занимайтесь фигнёй с cat - "Хоботов ! Это не серьёзно !"
Такими методами вы получите не "умный дом", а "***УДАЛЕНО*** плюшевую, детскую за 3 рубля"
Если по серьёзному, то надо смотреть в сторону modbus
Ладно ... учитесь на своих ошибках. До "realtime" задач на Arduino, вам пока далеко  :'(
Хороший цикл статей по интересующей вас тематике есть здесь - http://robocraft.ru
Вы поставили себе громадные задачи, но пока не имеете даже элементарных знаний !
Программирование микроконтроллеров, зачастую сложнее, чем программирование в Linux.
У микроконтроллеров нет OS (операционной системы), которая помогает вам не отвлекаться на обработку прерываний,
планирование процессов и.т.д. мизерная память (не гигабайты, а в лучшем случае пару килобайт оперативки и пару десятков или сотен килобайт для кода)
Для Aduino , всё это вам придётся делать самому... Почитал ваши предидущие посты.
Ваше изумление, по поводу отсутствия "фоновых процессов" &  ;D
Вы пока зациклились на мизерной частности и АБСОЛЮТНО не вникаете в суть проблем, увы ...

+20% за нарушение п.2.1. Правил
Sly_tom_cat
« Последнее редактирование: 19 Февраля 2014, 17:36:45 от Sly_tom_cat »
Я знаю то, что ничего не знаю, но некоторые не знают и этого. Сократ

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Логирование с com
« Ответ #12 : 19 Февраля 2014, 13:15:16 »
cat /dev/cu.usbmodemfa121 | while read raw
do
   echo $raw
done
Да не так же!cat /dev/cu.usbmodemfa121 > raw.log & #запускаете чтение с датчика отдельным процессомПотом запускаете скрипт и уже делаете с данными что нужно. Напримерwhile read raw ; do echo $raw ; done < raw.log
значения температуры которые нужно поделить на 16, почему не знаю, но дополненные пробелом
Бороться с этим надо такwhile IFS= read -r raw
/16")syntax error: operand expected (error token is "
Если в переменной пробел, то чему удивляться?
« Последнее редактирование: 19 Февраля 2014, 14:08:04 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

Страница сгенерирована за 0.066 секунд. Запросов: 25.