LinuxForum.Fans
Тема

чтение com-порта

Автор: spyphy 17 сообщений 7126 просмотров
#358455

Хочу прочитать данные с com-порта. Всё равно как, главное чтоб работало. Сейчас пробую через командную строку, но через функции c/c++/qt тоже сойдет. Под windows проверял - всё работает.
На подключенном устройстве выставлено 1 стоп-бит без контроля четности, кадр из 8 бит (где это под линуксом выставляется - без понятия). Но нужную скорость 10000 бод я задал.

text

setserial /dev/ttyS0 baud_base 10000
root@comp:~# setserial -a /dev/ttyS0
/dev/ttyS0, Line 0, UART: 16550A, Port: 0x03f8, IRQ: 4
    Baud_base: 10000, close_delay: 50, divisor: 0
    closing_wait: 3000
    Flags: spd_normal skip_test
text

 cat /dev/ttyS0

- глухо и тихо.

доп. информация:

text

cat /proc/tty/driver/serial 
serinfo:1.0 driver revision:
0: uart:16550A port:000003F8 irq:4 tx:1982 rx:991 brk:991
1: uart:unknown port:000002F8 irq:3
2: uart:unknown port:000003E8 irq:4
3: uart:unknown port:000002E8 irq:3

dmesg [ 0.925854] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A [ 0.952590] 00:08: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A

#358492

если просто прочитать то minicom.
в нем и настройки все делаются

#358493

скорость 10000 это что-то оригинальное

#358499
vic5710 написал:
скорость 10000 это что-то оригинальное

Вот мне тоже интересно, чем не понравилось это число разработчикам модемов. Я ее таким брал, потому что у меня кварц на 12000000 Гц и всё бы точно получалось. Впрочем ладно, выставил я сейчас 9600 (точнее где-то около того - кажется это большой роли здесь не играет).

если просто прочитать то minicom.

С minicom работает. То есть данные читает. Это уже хорошо. Правда эти данные мне нужно будет еще как-то обрабатывать.

Оказывается для отправки данных работает команда

text
printf "0" > /dev/ttyS0

Правда работает только, если я ничего не меняю в настройках, т.е. остаётся Baud_base: 115200. И это странно.

А вот если пишу

text
cat /dev/ttyS0

то линукс ничего не выводит, но какие-то данные отправляются на внешнее устройство. Странно, ибо мне казалось, что должно быть наоборот.

#358500

А вот сейчас наоборот

text
root@comp:~# cat /dev/ttyS0

работает,

text
 printf "1" > /dev/ttyS0

нет. Хотя ничего не трогал.
Ладно, разберусь как-нибудь.

#358501

9600 из ряда стандартных скоростей : 9600 19200 34800 и тд
я бы делал cat /dev/ttyS0 > file.bin
hexdump -C file.bin
а в driver/serial tx - отпрвлено байт rx - принято

#358509

Пользователь в группе dialout есть?

#358518

Терминал для отладки устройств на COM-порту с графическим интерфейсом называется cutecom. В нём можно выбрать нужное устройство, скорость и параметры. Если у Вас его нет, то установите.

Пользователь должен быть в группе dialout.

Если нужно написать своё приложение на Qt, котрое работает с устройством на COM-порту, то смотрите здесь http://diymicro.ru/pic-mk-eksperiment-n19-pishem-prilozhenie-dlya-com-porta-s-pomoshhyu-qt.html про расширение для Qt qserialport.

Можно обрабатывать данные от устройства при помощи shell-скрипта. Можно управлять COM-портом вообще без программирования при помощи stty, cat и echo.

В консоли можно посмотреть данные на COM порту так:

Сначала выполнить (устанавливает параметры COM-порта):

text

stty 9600 raw -echo /dev/ttyS0

Вместо 9600 подставить нужную скорость вместо ttyS0 своё устройство.

Затем в одной консоли запустить:

text

cat /dev/ttyS0

Если нужно смотреть ответ устройства в шестнадцатеричных кодах, то нужно использовать hexdump^

text

hexdump -C /dev/ttyS0

В другой консоли можно теперь передавать данные от устройства и смотреть ответ устройства в первой консоли:

text

echo "1">/dev/ttyS0

Данные передаваемые от ПК к устройству в первой консоли не отображаются, но устройство их получает и интерпретирует и выдаёт ответ.

#358534
"mozgfx" написал:
пользователь в группе dialout есть?

нету. я под рутом выполняю.
Да в принципе почти всё работает. Единственное что

text
cat /dev/ttyS0 

не выводит результат. Вместо этого linux эти данные отправляет обратно же на com-порт, т.е. работает всё равно как

text

cat /dev/ttyS0 > /dev/ttyS0

Если в файл писать, то тоже самое - файл пустой, данные идут обратно на выход. В /proc/tty/driver/serial это и отражается - сколько пришло, столько и ушло. И это мне не понятно.

#358536

компорт настраивается через структуру termios поищите на этом форуме теги rs232 rs485 там я готовые примеры приводил

#358586
text

cat /dev/ttyS0

Так и должно выводить в консоль только ответы от Вашего прибора, который подключен к COM-порту. Данные, которые посылаются в COM порт командой echo уходят сразу в прибор. Что за устройство у Вас подключено к COM-порту?

Если имеются затруднения с консолью, то ставьте cutecom. В нём всё просто и понятно. Выглядит он вот так:

#358593
"vvk" написал:
Так и должно выводить в консоль только ответы от Вашего прибора, который подключен к COM-порту. Данные, которые посылаются в COM порт командой echo уходят сразу в прибор. Что за устройство у Вас подключено к COM-порту?

Не совсем понял, чем ответы прибора отличаются от просто посылаемых им данных. Там обычный микроконтроллер, который шлет по байту через каждые 100 мс.
cutecom - то что надо, без излишеств и исходники есть на Qt.

#358626

В Вашем случае после того, как Вы дали команду cat /dev/ttyS0 и подключили свой прибор к COM-порту в терминале должен быть поток символов. Новый символ добавляется каждые 100мс. Если для для данного ASCII - кода нет печатного символа (буква, цифра и т.п.), то в консоли мы ничего не увидим или увидим мусор. Тогда нужно использовать hexdump. Он показывает шестнадцатеричные коды.

Не выводятся в команде cat данные, которые компьютер посылает в COM порт, а все данные от устройства к компьютеру выводятся.

cutecom из исходников собирать не нужно! Он должен быть у Вас в репозиториях. Вобщем сначала разберитесь с cutecom, а затем приступайте к консоли.

И ещё лучше перейти на взаимодействие Вашего прибора с компом по принципу "запрос-ответ". То есть комп отправляет запрос в COM-порт, прибор высылает ответ, а комп его потом интерпретирует.

#358648
"vvk" написал:
лучше перейти на взаимодействие Вашего прибора с компом по принципу "запрос-ответ".

Это не помогает. Просто всё зацикливается.
Символы там все печатные (ASCII).
Похоже какой-то глюк в конфигурации порта. Если поюзать утилиту cutecom, то после нее cat начинает нормально работать.
Ладно, не суть важно. Мне пока этого достаточно. Спасибо.

#358693

Дело в том, что COM-порт запоминает свои последние настройки. После запуска cutecom COM-порт правильно конфигурируется (т.к. cutecom всегда явно передаёт COM порту все параметры) и cat /dev/ttyS0 начинает работать правильно. У меня тоже так было когда в первый раз разбирался с СОМ.

Чтобы посмотреть параметры и скорость COM-порта в консоли нужно дать команду:

text

stty -a -F /dev/ttyS0

Теперь дайте эту команду до и после запуска cutecom и смотрите что изменилось в настройках. После этого надо будет в команду настройки COM порта через stty

text

stty 9600 raw -echo -F /dev/ttyS0

Дописать ещё параметры. Видимо в Вашем случае здесь нужно добавить ещё параметры, а у меня такой команды достаточно для инициализации COM-порта.

Итак, чтобы запустить COM в консоли сначала даёте stty, затем cat и затем подключаете Ваш аппарат и всё должно работать.

#358751

А я понял. Всё дело в параметрах raw, echo. Теперь работает. Я их не задавал, т.к. не знал что они означают. С echo еще понятно, а вот что за raw такой...

#358801

Если кратко, то raw устанавливает, что данные в компьютер передаются байт за байтом так же как приходят в порт без преобразований. Аппаратное управление потоком отключено. Подробнее о том, что включает и выключает raw - см. man stty.

Войдите или зарегистрируйтесь, чтобы ответить.