Як надіслати дані до послідовного порту і побачити будь-яку відповідь?


37

У Linux я хочу надіслати командний рядок (тобто деякі дані) до послідовного порту (містить контрольні символи) та прослухати відповідь (який також зазвичай може містити символи управління).

Як я можу зробити це якомога простіше в Linux? Приклад цінується!


ви повинні подивитися на цей unix.stackexchange.com/a/116705/53092
Kiwy

У мене не встановлено перехоплення.
Олексій

1
номінація на повторне відкриття - це не дублікат, як пропонується.
петерф

деякі люди занадто дурні, вони просто пропонують питання як дублі. Спершу потурбуйтеся прочитати запитання та відповіді.
Денис

Відповіді:


54

Усі пристрої в Unix відображаються у файл пристрою, послідовні порти будуть /dev/ttyS0 /dev/ttyS1...

Спочатку ознайомтеся з дозволами на цей файл, припустимо, ви використовуєте /dev/ttyS1.

ls -l /dev/ttyS1

Ви хочете отримати доступ до read.write, якщо це спільна система, тоді слід розглянути наслідки для безпеки для її відкриття для всіх.

chmod o+rw /dev/ttyS1

Дуже простий метод для запису у файл, використовував би просту echoкоманду.

echo -ne '\033[2J' > /dev/ttyS1

і читати

cat -v < /dev/ttyS1

Ви можете мати кішку, що працює в одному терміналі, і лунати в другому.

Якщо все гріш, то швидкість передачі даних, налаштування бітів може знадобитися налаштування перед тим, як розпочати надсилання. sttyзробимо це. !! ПРИМІТКА stty використовуватиме stdin як дескриптор файлів за замовчуванням для впливу.

Еквівалентні команди.

stty 19200 < /dev/ttyS1
stty 19200 -F /dev/ttyS1

Цього може бути достатньо, щоб ви щось скриптували та входили? Не впевнений, чого ви намагаєтесь досягти.

Для більш інтерактивного, пам’ятайте, що ваш підхід до налаштувань за замовчуванням було б використовувати minicomце просто програма, яка робить все, про що я згадував до цих пір. (подібно до гіпертерміналу в Windows, можливо, ви знайомі).

Проміжне рішення використовувало б термінальну програму, screenяка працює на послідовному пристрої.

screen /dev/ttyS1

man screen man minicom man stty для отримання додаткової інформації


Я взагалі не отримую жодного результату. Є якісь ідеї?
Золоте ім'я

Можливо апаратне управління потоком: або вимкнути за допомогою команди atty, або підв’язати ремінь високо в послідовному кабелі, шукати нульовий кабель модему.
X Тіан

1
# stty -speed 38400 -f /dev/ttyUSB1поверненняstty: invalid argument '-speed'
Pro Backup

1
на stty встановити пристрій -F (величина F). Також параметр швидкості невірний. Ви можете використовувати швидкість, щоб отримати швидкість передачі в порту, або швидкість, або швидкість (без знака мінус) для встановлення швидкості введення і виводу, або просто число для встановлення швидкостей введення і виводу, наприклад: stty 19200 -F / dev / ttyS ....
Павло

Дивно, що раніше ніхто не помітив, дякую @Pro Backup, я виправив приклад.
X Тянь

11

Все, що вам потрібно зробити - це відкрити два клеми. У першому терміналі ви catвсе з пристрою, наприклад

cat /dev/ttyS0

в іншому терміналі ви можете надсилати до терміналу довільні шістнадцяткові символи та текст, наприклад:

echo -e "\x7E\x03\xD0\xAF und normaler Text" > /dev/ttyS0

echo -eКоманда дозволяє інтерпретувати зворотний слеш.

Слід, звичайно, переконатися, що (i) параметри послідовності (швидкість, довжина слова, ctrl потоку тощо) є правильними, і (ii) серійний пристрій (на іншому кінці) не блокується.


Ви відповіли на це через 10 хвилин після того, як я написав свою відповідь вище, і ви взагалі не додали більше інформації!
X Тіан

Пробачте, я не прочитав вашої відповіді повністю. Я бачив, що моя відповідь включена у вашу, тому я прийму вашу відповідь як правильну, як ви описали саме те, що я описав.
Олексій

Я мало знаю про COM-порти. Чи можете ви поясніть, що означає "серійний пристрій (з іншого боку) не блокується?" Якісь проблеми з брандмауером?
Sopalajo de Arrierez

9

Програми, що розмовляють із серійними пристроями:

picocom
minicom
socat

або з оболонки ви можете:

stty -speed 19200 < /dev/ttyS0 # sets the speed of the port
exec 99<>/dev/ttyS0 (or /dev/ttyUSB0...etc)
printf "AT\r" >&99
read answer <&99  # this reads just a CR
read answer <&99  # this reads the answer OK
exec 99>&-

ваш - це дивовижна відповідь, яка навчила мене про двосторонні дескриптори файлів. Однак ви впевнені, що синтаксис останнього рядка для закриття дескриптора правильний? Я отримую синтаксичну помилку. Я думаю, що exec 99<&-або exec 99>&-слід використовувати. Або можливо і те й інше?
Янкі

1
помилка .. ви праві
Zibri

7

Це може бути кращим підходом:

stty -F /dev/ttyUSB0 115200 raw -echo   #CONFIGURE SERIAL PORT
exec 3</dev/ttyUSB0                     #REDIRECT SERIAL OUTPUT TO FD 3
  cat <&3 > /tmp/ttyDump.dat &          #REDIRECT SERIAL OUTPUT TO FILE
  PID=$!                                #SAVE PID TO KILL CAT
    echo "R" > /dev/ttyUSB0             #SEND COMMAND STRING TO SERIAL PORT
    sleep 0.2s                          #WAIT FOR RESPONSE
  kill $PID                             #KILL CAT PROCESS
  wait $PID 2>/dev/null                 #SUPRESS "Terminated" output

exec 3<&-                               #FREE FD 3
cat /tmp/ttyDump.dat                    #DUMP CAPTURED DATA

Це дуже добре, адже це автоматизує процес! Єдина зміна, яку я б вніс, - це підтвердити, що отриманий вміст такий самий, як надісланий - це може бути лише кількість або повна різниця.
HiDefLoLife

4

Ви можете читати та записувати на пристрій одночасно:

cat /dev/cu.usbmodem411 & cat > /dev/cu.usbmodem411

Ваше повідомлення надсилається другому catвід stdinпершого, і перше catпередає відповідь stdout, перетворюючи свій термінал у чат.

Щоб закінчити, ctrl-c, а потім запустити fgпотім ctrl-cзнову.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.