LinuxForum.Fans
Тема

ISA UART

Автор: noonv 8 сообщений 3321 просмотров
#194844

Приветствую!
ALT Linux 5.0 (2.6.30)

ISA-я плата (контроллер XR16C2850) с двумя UART-ами
устанавливаю джамперами базовый адрес и прерывания

настраиваю последовательные порты:

text
setserial /dev/ttyS4 uart 16850 port 0x100 irq 5 baud_base 3686400
setserial /dev/ttyS5 uart 16850 port 0x108 irq 6 baud_base 3686400

проблема:
на скорости 921600, при считывании одиночных байт проблем не возникает, но при попытке считывания пакета данных ( например, 134 байта) часть байтов пакета теряются (причём байт может потеряться и в середине пакета О_о).

пробовал уменьшать скорость, но похоже, потерь нету только на 9600 :o

подскажите, в чём может быть дело?
Спасибо!

PS
сам альт, скорее всего действительно не причём, но возникает вопрос - в чём может быть дело :(
не хватает времени на обработку прерывания (FIFO 128 байт)?
но я подключаю к этому же компу переходник USB-RS422 (FIFO 64 байта) и всё считывается нормально :-[

#195065

IRQ 6 - это прерывание от floppy. Если он есть, его надо запретить в BIOS SETUP.
Вообще все претензии к программе, работающей с этими портами.
Если это готовая, её надо настроить, если своя, надо в ней правильно настроить порт.

Пётр.

#195067

дисковода нет, программа своя :)
перепробовал все настройки :) в какую хоть сторону копать? :)

#195093
noonv написал:
дисковода нет, программа своя :)
перепробовал все настройки :) в какую хоть сторону копать? :)

Я устанавливаю параметры порта через структуру termios. Сначал её
обнуляю, а потом устанвливаю, что нужно. Ещё при открытии порта
я всегда указываю флаг O_ASYNC. До сих пор это делал уже после
открытия вызовом fcntl, но вот недавно в программе на Qt это по
непонятной причине перестало работать и я стал и этот флаг указывать
в вызове open вместе с другими. У меня лет 8-9 назад был для Qt
создан класс COM-порта и я до сих пор им пользуюсь.

В программах на C делается так же - с termios и вызовом fcntl для
установки флага O_ASYNC, но там я ещё не проверял, не перестало
ли эти выполняться.

Пётр.

#195103

Я устанавливаю параметры порта через структуру termios. Сначал её
обнуляю, а потом устанвливаю, что нужно.

делаю так же :)

Ещё при открытии порта я всегда указываю флаг O_ASYNC. До сих пор это делал уже после
открытия вызовом fcntl, но вот недавно в программе на Qt это по
непонятной причине перестало работать и я стал и этот флаг указывать
в вызове open вместе с другими.

хм.. попробую, думал O_NONBLOCK достаточно:

port_fd = open(portName, O_RDWR | O_NOCTTY | O_NONBLOCK);
#195175

O_NOCTTY не приходилось указывать, а O_NONBLOCK не пробовал,
т.к. удовлетворился O_ASYNC. В зависимости от задачи надо устанавливать
также VMIN и VTIME. У меня обычно VMIN=0, а VTIME задано.

Пётр.

#195800

использование O_ASYNC даёт тот же результат :(

#195981

Не знаю, с обычными COM-портами у меня не было проблем.
Возможно, ошибка драйвера этой карты.
У меня при работе с COM-портом всегда делается небольшая обёртка для
системной read, в зависимости от формата ожидаемого пакета.
Если не используется какой-то стандартный протокол, xmodem, например,
то вы полный хозяин ситуации. М.б., программа не успевает считывать
данные из буфера. Т.е. надо искать причину.

Пётр.

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