Приём данных от Arduino в Linux-консоли. Как?

Доброе время суток!

Есть Arduino, которая шлёт постоянный поток данных на компьютер c Linux. Данные идут через /dev/ttyACM0.
Вопрос: как читать данные от неё и сохранять их в файл serial_port.data?

cat /dev/ttyACM0 > serial_port.data

tail -f /dev/ttyACM0 > serial_port.data

не помогают. Сохраняют только обрывочные данные (2-5 символов, которые передавались во время запуска команды).

UPD: Полурешение.
Во-первых, установлена задержка передачи данных с Arduino через последовательный порт, чтобы данные шли не потоком символов, а порциями. Во-вторых, в одном терминале:

tail -f /dev/ttyACM0

А в другом переодически выполняется

cat /dev/ttyACM0 >> serial_port.data

Частота выполнения cat и задержка в передаче данных от Arduino должны быть согласованы, таким образом плата посылает один пакет данных, он «запоминается» командой tail и направляется в файл командой cat. «Запомненное» командой tail очищается. И по новому кругу.

Прошу прощения за термины. Описанное — полумера. Если кто знает как сделать лучше и красивее — велкам!
  • Вопрос задан
  • 23526 просмотров
Решения вопроса 1
@howeal
Не забывайте про stty и настройку COM порта. У меня настройка идёт такой командой.
stty -F /dev/ttyACM0 cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts raw

код для Arduino:
Serial.begin(9600);
Serial.println("START");

Демон, читающий каждые 3 секунды команды с Arduino и выводящий всё на консоль (на sh). Текст от Arduino попадает в переменную $LINE:

#!/bin/sh
insmod usbserial
insmod ftdi_sio
insmod cdc-acm

while [ true ]
do

stty -F /dev/ttyACM0 cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts raw

	while read LINE
	do
	
	echo $LINE
			
	done < /dev/ttyACM0
/bin/sleep 3
done



Таким образом, при запуске демона Arduino сама перезагружается и пишет в консоль, при подключении/отключении производится повторная настройка порта и всё продолжает работать дальше.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 8
blo
@blo
инженер-программист
Попробуйте
while [ 1 ]; do
    DATA=`dd if=/dev/ttyACM0 count=1`
    echo $DATA
done
Ответ написан
Комментировать
Drabadum
@Drabadum Автор вопроса
Ого! Большое спасибо, blo и howeal, за ответы!
Ответ написан
Комментировать
noonv
@noonv
hexdump пробовали? и в чём проблема написать свою программку-логер? )
Ответ написан
Комментировать
Drabadum
@Drabadum Автор вопроса
Мне показалось, что будет красиво собирать данные именно консольными средствами. Hexdump попробую, спасибо!
Ответ написан
Комментировать
@Disasm
Насколько я понимаю, вам следует копать в сторону предварительной установки параметров передачи данных вроде baud rate и контроля чётности. Если они установлены некорректно, то вы будете получать мусор вместо данных. Вроде как это умеет утилита setserial.
Ответ написан
kalduntus
@kalduntus
system administrator
хм, набрел на вопрос. ситуация похожа (ардуина, linux), ардуина сыпет данные температуры каждую секунду T=***
у себя решил так:
#!/bin/bash
DATEFORMAT=$(date '+%m/%d/%y %H:%M:%S') #формат таймстампа
DEVICE='/dev/ttyACM0' #порт устройства
echo $(head -n 1 $DEVICE) $DATEFORMAT >> temperature.csv  #само собой перекидка в файл, каждая запись новой строкой.

и поставить в cron на удобное время, так сказать временный профит, но ТАК как никто не делает.
Ответ написан
Комментировать
@korobkinos
А как отправить данные ардуине на COM-порт?
Ответ написан
Комментировать
@ugsm
Выполняю вот такой скрипт:
#!/bin/sh
stty -F /dev/ttyUSB0 cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts raw
cat /dev/ttyUSB0 > serial_port.data
exit

Ардуина шлет раз в несколько секунд строку типа temp1;temp2;temp3
По логике, перенаправление ">" должно файл каждый раз переписывать, и в файле должна быть всегда одна строчка, но по факту получается, что файл дописывается и разрастается. Вывод строки в последовательный порт ардуины идет командой Serial.println. Может быть надо какой-то дополнительный символ конца строки передавать в порт, чтобы cat понимал, что надо файл переписывать или в данном случае не поможет?

Второй вопрос. Однажды запущенный скрипт (и даже закрытый или убиенный через killall) продолжает писать данные в файл. Как его остановить? :) Можно открыть minicom, он отображает данные (но как мне показалось, не все, т.к. скрипт пишет в файл чаще). Штатное закрытие minicom запись скриптом в файл не останавливает.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы