LINUX.ORG.RU

Получить данные от arduino в bash


0

1

Моя arduino (/dev/ttyACM0) шлёт каждые n секунд 16-битное число. Хочу написать скриптик, который будет выполнять ту или иную команду, в зависимости от того, что пришло.
Данный вопрос в тырнетах обсуждается довольно широко (сейчас у меня открыто ~6 табов с англоязычных форумов), но я так и не нашёл способа реализовать это.
В bash я довольно слаб, так что, возможно, просто делаю что-то не так.
Ваши предложения, господа?

Покажите пример приходящего числа. Оно приходит простым текстом, или его нужно снимать hexdump'ом?

AITap ★★★★★
()
Ответ на: комментарий от AITap

cornholio@desktop:~$ cat /dev/ttyACM0
192
128
2
2
2
128
128
128
128
136
8
8
8
8
192
0
192
192
1
8
10
10
202
192
193
193
1
0
10
138
10
0
129
1
1
8
8
8
192
0
0
0
4
6
так, например

GreatCornholio
() автор топика
Ответ на: комментарий от GreatCornholio

Как-то так:

while read number
do
 case $number in
 0)
  echo "number is zero!"
  ;;
 128)
  echo "oops, it's 2^7"
  ;;
 *)
  echo $number
  ;;
 esac
done < /dev/ttyUSB0

Двоичная арифметика в bash тоже реализуется (см. man bash, раздел ARITHMETIC EVALUATION)

AITap ★★★★★
()

это принципиально должен быть bash ?

на чём угодно другом решается в разы проще - это не совсем задача shell`а

скелетик скрипта на tcl (не тестировалось естественно):

#!/usr/bin/tclsh
set the_end 0
proc priperlo { f } {
	if { [ catch { string trim [ gets $f ] } s ] || { $s == "" && [ eof $f ] } } {
		set the_end 1
		return
	}
	switch -glob $s {
		1 {
			do_action_1
		} 2 {
			do_action_2
		} "23*" {
                        do_action_bymask
                }
	}
}
set f [ open "/dev/ttyACM0" "r" ]
fconfigure $f -buffering line -handshake none -mode "2400,n,8,1"
fileevent $f readable [ list priperlo $f ]
vwait the_end

или любой другой знакомый и понятный язык.

MKuznetsov ★★★★★
()
Ответ на: комментарий от GreatCornholio

> Почему-то срабатывает только последнее условие.
Натравите на /dev/ttyS0 hexdump. Возможно, вместо перехода на новую строку символом \n там используется \r\n, что делает строку «128\r\n» не равной «128».

В этом случае можно немного модифицировать программу:
dos2unix < /dev/ttyUSB0 | while read number; do ...

Ну и, конечно же, на других языках программирования (C, Perl, Python, Tcl...) это реализуется более просто.

AITap ★★★★★
()
Ответ на: комментарий от MKuznetsov

>любой другой знакомый и понятный язык. есть помыслы написать это на сях, но желательно это сделать именно на bash, ибо потом всё равно собираюсь связывать с ним.

GreatCornholio
() автор топика
Ответ на: комментарий от AITap

>Возможно, вместо перехода на новую строку символом \n там используется \r\n, что делает строку «128\r\n» не равной «128» Да, вы правы. Но модификация скрипта так, как вы предложили - так же не работает. Мне кажется, я неправильно его модифицировал...

GreatCornholio
() автор топика
Ответ на: комментарий от AITap

00000000 30 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d |0.0..0..0..0..0.|
00000010 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a |.0..0..0..0..0..|
00000020 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 |0..0..0..0..0..0|
00000030 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d |..0..0..0..0..0.|
00000040 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a |.0..0..0..0..0..|
00000050 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 |0..0..0..0..0..0|
00000060 0d 0a 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a |....0..0..0..0..|
00000070 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 |0..0..0..0..0..0|
00000080 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d |..0..0..0..0..0.|
00000090 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a |.0..0..0..0..0..|
000000a0 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 |0..0..0..0..0..0|
000000b0 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d |..0..0..0..0..0.|
000000c0 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a |.0..0..0..0..0..|
000000d0 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 |0..0..0..0..0..0|
000000e0 0d 0a 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a |....0..0..0..0..|
000000f0 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 |0..0..0..0..0..0|
00000100 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d |..0..0..0..0..0.|
00000110 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a |.0..0..0..0..0..|
00000120 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 |0..0..0..0..0..0|
00000130 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d |..0..0..0..0..0.|
00000140 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a |.0..0..0..0..0..|
00000150 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 |0..0..0..0..0..0|
00000160 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d |..0..0..0..0..0.|
00000170 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a |.0..0..0..0..0..|
00000180 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 |0..0..0..0..0..0|
00000190 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d |..0..0..0..0..0.|
000001a0 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a |.0..0..0..0..0..|
000001b0 30 0d 0a 30 0d 0a 38 0d 0a 38 0d 0a 38 0d 0a 38 |0..0..8..8..8..8|
000001c0 0d 0a 32 30 30 0d 0a 32 30 30 0d 0a 31 39 32 0d |..200..200..192.|
000001d0 0a 31 39 32 0d 0a 31 32 38 0d 0a 30 0d 0a 30 0d |.192..128..0..0.|
000001e0 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a |.0..0..0..0..0..|
000001f0 30 0d 0a 31 32 38 0d 0a 30 0d 0a 30 0d 0a 31 32 |0..128..0..0..12|
00000200 38 0d 0a 30 0d 0a 30 0d 0a 31 33 37 0d 0a 31 33 |8..0..0..137..13|
00000210 37 0d 0a 39 0d 0a 31 33 37 0d 0a 32 30 31 0d 0a |7..9..137..201..|
00000220 38 0d 0a 32 30 30 0d 0a 31 39 32 0d 0a 31 0d 0a |8..200..192..1..|
00000230 38 0d 0a 38 0d 0a 38 0d 0a 31 33 36 0d 0a 31 32 |8..8..8..136..12|
00000240 38 0d 0a 31 39 32 0d 0a 31 39 32 0d 0a 31 39 32 |8..192..192..192|
00000250 0d 0a 31 32 38 0d 0a 31 39 32 0d 0a 32 30 32 0d |..128..192..202.|
00000260 0a 31 33 38 0d 0a 32 30 32 0d 0a 31 33 38 0d 0a |.138..202..138..|
00000270 31 33 36 0d 0a 31 32 38 0d 0a 31 32 38 0d 0a 31 |136..128..128..1|
00000280 39 32 0d 0a 31 39 32 0d 0a 31 39 33 0d 0a 31 33 |92..192..193..13|
00000290 37 0d 0a 32 30 32 0d 0a 31 33 38 0d 0a 31 33 38 |7..202..138..138|
000002a0 0d 0a 31 39 34 0d 0a 31 33 32 0d 0a 31 33 33 0d |..194..132..133.|
000002b0 0a 31 33 33 0d 0a 31 33 33 0d 0a 31 32 39 0d 0a |.133..133..129..|
000002c0 31 33 38 0d 0a 32 30 32 0d 0a 32 30 32 0d 0a 32 |138..202..202..2|
000002d0 30 32 0d 0a 32 30 30 0d 0a 31 39 33 0d 0a 31 39 |02..200..193..19|
000002e0 37 0d 0a 31 33 33 0d 0a 31 33 30 0d 0a 31 39 34 |7..133..130..194|
000002f0 0d 0a 31 33 38 0d 0a 31 33 38 0d 0a 31 33 36 0d |..138..138..136.|
00000300 0a 31 32 39 0d 0a 31 33 33 0d 0a 31 33 33 0d 0a |.129..133..133..|
00000310 31 32 39 0d 0a 31 33 36 0d 0a 32 30 32 0d 0a 32 |129..136..202..2|
00000320 30 32 0d 0a 32 30 32 0d 0a 31 39 32 0d 0a 31 33 |02..202..192..13|
00000330 33 0d 0a 31 39 37 0d 0a 31 39 37 0d 0a 31 32 38 |3..197..197..128|
00000340 0d 0a 32 30 32 0d 0a 31 33 38 0d 0a 31 33 38 0d |..202..138..138.|
00000350 0a 30 0d 0a 35 0d 0a 35 0d 0a 35 0d 0a 35 0d 0a |.0..5..5..5..5..|
00000360 38 0d 0a 31 30 0d 0a 31 30 0d 0a 31 30 0d 0a 31 |8..10..10..10..1|
00000370 30 0d 0a 31 30 0d 0a 31 39 32 0d 0a 31 39 32 0d |0..10..192..192.|
00000380 0a 31 39 32 0d 0a 31 39 32 0d 0a 31 39 32 0d 0a |.192..192..192..|
00000390 31 32 38 0d 0a 31 32 38 0d 0a 30 0d 0a 30 0d 0a |128..128..0..0..|
000003a0 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 |0..0..0..0..0..0|
000003b0 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d 0a 30 0d |..0..0..0..0..0.|

GreatCornholio
() автор топика
Ответ на: комментарий от GreatCornholio

Сохранил в /tmp/test.txt, запускаю:

[20:53:12][aitap@Tarkus ~]> xxd -r < /tmp/test.txt | dos2unix | while read n; do case $n in 0) echo "ZERO" ;; 128) echo "2^7" ;; *) echo $n; esac; done | head
ZERO
ZERO
ZERO
ZERO
ZERO
ZERO
ZERO
ZERO
ZERO
ZERO
[20:53:23][aitap@Tarkus ~]> xxd -r < /tmp/test.txt | head
0
0
0
0
0
0
0
0
0
0
[20:53:33][aitap@Tarkus ~]> 

У меня работает.

AITap ★★★★★
()
Ответ на: комментарий от AITap

вполне работают варианты с «num=`echo $number |dos2unix`» и
hex=`echo $number | xxd -p` и сравнением значений с кодами.
Думаю ночью ещё один вариант опробовать

GreatCornholio
() автор топика

В общем, остановился на варианте сравнения с hex. Нормально работает.

GreatCornholio
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.