LINUX.ORG.RU

передать на сериал порт 0xA как данные

 


0

1

Доброго дня, Столкнулся вот с такой проблемой. Есть linux, к нему по USB подключено устройство, определяется системой как /dev/ttyACM0. Управлятся это чудо с помощью передачи на него определенных строк, например. Вначале готовлю устройство к приему:

stty -F /dev/ttyACM0 raw -echo

Теперь на него можна слать данные, мне к примеру нужно послать пять значений в шестнадцатиричном коде, к примеру вот таких: 55 90 0F 01 25

Для этого я выполняю элементарную команду в консоле:

echo -en '\x55\x90\x0F\x01\x25' > /dev/ttyACM0

Все работает просто замечательно, устройство принимает команду и выполняет без проблем. Это все предисловие, а теперь о том что доставило мне реальную боль в последние два дня. Возникла необходимость отправить другие данные, а именно которые включают в себя значение 0A в шестнадциричном коде. конечно я выполнил такую команду:

echo -en '\x55\x90\x0A\x01\x25' > /dev/ttyACM0

но чуда не произошло, устройство не выполнило команду. После нескольких тщетных попыток принял решение посмотреть а что же linux шлет на устройство с помощью USBMon. И все встало на свои места, вскрытие показало что при посылке данных которые включают 0XA с места где есть этот код есть переходит на новую строку. Устройство получает эту одну строку как две строки:

\x55\x90\0xA

\x01\x25

Итак простой вопрос, как передать на устройство данные которые включают в себя 0xA, чтобы это 0xA не разделило строку надвое а все было доставлено к адресату одной строкой.

Сделал нескольку топиков на зарубежных гуру форумах, но вразумительного ответа с рабочим примером не получил. Надеюсь что на этом форума люди обладают более высокой квалификацией :).



Последнее исправление: victor3000 (всего исправлений: 1)

-e enable interpretation of backslash escapes
Ну и что ты от echo хотел? Может не надо указывать -e?

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

неа

в этом случае на устройство отправилось 3 пакета

55 90
0d 0a
01 25

0a вообще превратился в 0d 0a (\r\n)

CaHbl4
()

Устройство получает эту одну строку как две строки:

Это терминал разделяет строку. 0A - это походу и есть перенос. Скинь в файл, потом в tty.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от CaHbl4

Огромное тебе спасибо дорогой ты человек. Это действительно работает, я писал буржуям что дело в stty, но не знал на что заменить. Можна тему закрывать , надеюсь кому-то тоже поможет. Ещё раз спасибо.

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

Надеюсь что на этом форума люди обладают более высокой квалификацией :).

bite 80 левела

anonymous
()
Ответ на: комментарий от CaHbl4

а не подскажите еще как можно принять ответ? устройство после выполнения команды отправляет в ответ например 0xBC, хотелось бы видеть это в консоле.

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

обладают более высокой квалификацией

Тебя может не обрадовать в чём эта квалификация заключается.

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

А что не так? В одной спецолимпиаде участвуем. Он набрасывает, мы набрасываем, мы нашли друг друга.

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

в другой консоли (терминале) выполни

sudo cat /dev/ttyACM0
должно бы показать (хотя в отношении твоего устройства уверенности нет)

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

тут вообще зависит от того, что нужно в результате получить

cat такие байты читаемо вряд ли отобразит, хотя с текстом должно сработать

можно «читать» в переменную, и потом выводить в нужном формате

read -n1 INPUT  </dev/ttyUSB0
echo $INPUT | hexdump -ve '/1 "\\x%02X"'

# на выходе будет \xBC
# читать нужно начать до того, как устройство что-то пошлет
# + нужно подобрать параметры read под свой случай (например задать разделитель, который используется устройством)

Может имеет смысл использовать какой-нить python + pyserial для работы с устройством?

CaHbl4
()
Ответ на: комментарий от victor3000

попробуйте добавить конвейер, как Вам выше советовали

sudo cat /dev/ttyACM0|hd
Пример вывода
00000000  0d 0a 45 52 52 4f 52 0d  0a 0d 0a 2b 5a 55 53 49  |..ERROR....+ZUSI|
00000010  4d 52 3a 32 0d 0a 0d 0a  2b 5a 55 53 49 4d 52 3a  |MR:2....+ZUSIMR:|
00000020  32 0d 0a 0d 0a 4f 4b 0d  0a 0d 0a 2b 5a 55 53 49  |2....OK....+ZUSI|
00000030  4d 52 3a 32 0d 0a 0d 0a  4f 4b 0d 0a 0d 0a 2b 5a  |MR:2....OK....+Z|
00000040  55 53 49 4d 52 3a 32 0d  0a 0d 0a 4f 4b 0d 0a 0d  |USIMR:2....OK...|
00000050  0a 2b 5a 55 53 49 4d 52  3a 32 0d 0a 0d 0a 2b 5a  |.+ZUSIMR:2....+Z|

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

к сожалению предложенные вами варианты не работают. вот что я нашел на буржуйском форуме, немного переработал и в конце концов увидел ответ от устройства:

exec 3</dev/ttyACM0

cat <&3 > /tmp/ttyDump.dat &

PID=$!

echo -en '\x55\x90\xb\x01\x85' | dd of=/dev/ttyACM0

sleep 0.5s

kill $PID

exec 3<&-

xxd /tmp/ttyDump.dat

сам ответ выглядит так:

0+1 records in

0+1 records out

5 bytes copied, 0.000105741 s, 47.3 kB/s

0000000: 01

здесь ответом является 01

работает, но крайне неудобно. каждый раз надо редактировать файл чтобы отправить команду. в идеале как бы сделать чтоб мониторить вторым терминалом отправленные и полученные данные, например если в первом терминале я выполнил команду echo -en '\x55\x90\xb\x01\x85' | dd of=/dev/ttyACM0 то второй показал и отправленное и полученное например :)

x55 x90 xb x01 x85 x01

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

victor3000
() автор топика
Ответ на: комментарий от victor3000
#!/usr/bin/env bash

SEND_STRING=$1
DEVICE=/dev/ttyUSB0

exec 3<${DEVICE}
echo -en ${SEND_STRING} | dd of=${DEVICE} 2>/dev/null
[[ $? ]] && echo "Sended ${SEND_STRING}"
sleep 0.5
read -r -u3 INPUT
exec 3<&-

if [[ ${INPUT} != "" ]]
then
    PRINTABLE_HEX=$(echo -n ${INPUT} | hexdump -ve '/1 "\\x%02X"')
    echo "Received ${PRINTABLE_HEX}"
else
    echo "Something goes wrong"
fi
# Тест 1. На serial-интерфейсе стоит заглушка (Получаем то, что отправили)
./serial.sh '\x55\x90\x0b\x01\x85'
Sended \x55\x90\x0b\x01\x85
Received \x55\x90\x0B\x01\x85

# Тест 2. Убрал заглушку (ответа нет)
./serial.sh '\x55\x90\x0b\x01\x85'
Sended \x55\x90\x0b\x01\x85
Something goes wrong
CaHbl4
()
Ответ на: комментарий от victor3000

каждый раз надо редактировать файл чтобы отправить команду

А почему бы не «приготовить» ему команд? Иллюстрация

echo -en '\x55\x90\xb\x01\x85'>cmd_Hello
echo -en '\x55\x90\xb\x02\x85'>cmd_Ask
...
echo -en '\x55\x90\xb\xef\x85'>cmd_Stop

отдавать команды как-то так:

cat cmd_Hello|dd of=/dev/ttyACM0

Кстати в этой команде echo -en '\x55\x90\xb\x01\x85' выделенный байт дествительно x0B или что-то потерялось?

крайне неудобно

Как вариант половину экрана отдать эмулятору терминала для ввода команд, на второй половине другим эмулятором терминала мониторить ответ. (Скрипт можно слепить для посылки команд...)

В первом посте Вы упоминали

Вначале готовлю устройство к приему:

stty -F /dev/ttyACM0 raw -echo

Без этого обмен командами-ответами невозможен?

Уточняю открываете 2 эмулятора терминала. В правом терминале «настраиваете» приём ответов:

sudo cat /dev/ttyACM0|hd

В левом терминале отдаёте команды устройству (а всё-таки что за устройство «мучаем»)

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

мучаю я вот это чудо https://www.robot-electronics.co.uk/htm/usb_iss_tech.htm, кстати и вам рекомендую если есть подобная задача, там на странице есть что оно может, очень хороший девайс. Использовал под виндой его три года, но возникла необходисть с под linux. Сегодня потестить не получиться, завтра попробую, про результаты отпишу, спасибо за помощь.

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

404
We're sorry, the page you requested cannot be found.

А почему так страстно хочется из баш-скриптов бульбенить без минимальной прослойки? Можно ведь совсем простенький терминал вроде такого написать. Добавить туда параметров командной строки и работать. И постепенно оно превратится во что-нибудь эдакое.

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