|
|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Kirill Frolov 2:5030/827.2 29 Feb 2004 16:10:13 To : All Subject : Hастройка COM-портов и модемов. -------------------------------------------------------------------------------- On Sat, 28 Feb 04 02:23:48 +0300, Kirill Trofimov wrote: KT> RX packets:932 errors:722 dropped:0 overruns:0 frame:0 KT> TX packets:1028 errors:0 dropped:0 overruns:0 carrier:0 KT> RX bytes:1185503 (1.1 Mb) TX bytes:65290 (63.7 Kb) KT> Вот такое большое количество ошибок (722) - это нормально? Hет. KT> И когда они возникают, как бороться? Ошибки протокола LCP, или как его там уже забыл, кадров. Искажение передаваемой информации или пропуск отдельных байтов (точно твой случай) приводят именно к этому. Происходит это, наиболее вероятно, потому, что обработка прерывания модема (COM-порта) откладывается на недопустимо большое время. Это и некорректно написанные драйвера различных устройств (так, например, мой framebuffer в момент всяких переключений блокирует всё на несколько сотен миллисекунд...), и "unrealtime"-архитектура юних-систем сказывается... Да, я подразумеваю, это у тебя модем подключен, и соединение всегда устанавливается по протоколу с коррекцией ошибок. Для большей уверенности можно посмотреть вот что: $ cat /proc/tty/driver/serial serinfo:1.0 driver:5.05c revision:2001-07-08 0: uart:16550A port:3F8 irq:4 baud:1200 tx:116 rx:1662232 fe:357 brk:235 RTS|DTR|DSR 1: uart:16550A port:2F8 irq:3 baud:9600 tx:0 rx:0 2: uart:16550A port:3E8 irq:9 baud:38400 tx:3104493 rx:42074065 fe:29 oe:3 RTS|CTS|DTR|DSR > ^^^^ Подчёркнутое, с наибольшей вероятностью -- OVERRUN ERROR. (вот бы ещё в linux была документация -- мы бы знали это точно...) Микросхема UART совместимая с 16550A устанавливает признак ошибки OVERRUN ERROR каждый раз, когда в результате необработанного прерывания происходит потеря принимаемых байтов. Как можно заметить, у мыши "подвешенной" на COM1 байты не теряются, скорость передачи низкая потому что, зато немеряно ошибок связанных с обнаружением СТОП-бита... интересно с чем это связано? :-/ Бороться с overrun errors можно с помощью грамотной настройки COM-порта, в частности включения FIFO, если это возможно, установки оптимальной, /а не максимальной/, скорости передачи. Всё это делается программой setserial. Вот пример файла конфигурации: :r /etc/serial.conf /dev/ttyS0 uart 16550A port 0x03f8 irq 4 spd_normal skip_test /dev/ttyS1 uart 16550A port 0x02f8 irq 3 spd_normal skip_test /dev/ttyS2 uart 16550A port 0x03e8 irq 2 spd_normal skip_test # примечание: irq2 и irq9 это одно и то же прерывание. Возможно даже изменение аппаратной конфигурации для использования более приоритетного прерывания (мне кажется, с прерываниями в линухе бардак... эта irqtune -- она работает или нет?) Так модем лучше, конечно, на IRQ3 подключать. Потом устранение возможности блокировки разными драйверами. Советовалось расмаскировать прерывания во время обработки прерываний от диска утилитой hdparm, опция -u. Ещё возможны различные аппаратные конфликты. Hапример, какой-то там из COM-портов в IBM-PC явно конфликтует по портам с видео-адаптером. Так что стоит внимательно отнестись к вопросу, какой используется адрес порта, какое используется прерывание, на какой версии UART устроен порт (в документации по setserial этот вопрос подробно разобран) и можно ли разрешить использование FIFO-буфера. Кроме всего прочего ещё есть и другая сторона: настройка модема и режима работы порта относительно модема. Управление потоком, если только модем не внешний, и не подключен по 3-х проводному кабелю, стоит включить аппаратное (обозначается как RTS/CTS). Иначе тоже возможны ошибки передачи. Разрыв связи по сигналу DTR, отключение специальной обработки символов XON и XOFF и прочее тоже имеет значение. Типичные некоторые из наиболее важных настроек примерно такие, но отмечу особо, это сильно зависит от используемого модема, команды могут быть и другие: B0 -- использование рекомендаванного CCITT протокола V.21, вместо Bell-212 там принятого в США. В Европе принят именно V.21. Хочу обратить на это особое внимание пользователей FIDONET -- вы ОБЯЗАHЫ настроить модем именно так, иначе с вашей станцией невозможно будет установить связь на скорости 1200 бит/сек, которую вы ОБЯЗАHЫ поддерживать согласно последней версии устава FIDONET (то-есть Policy). &C1 -- сигнал DCD последовательного интерфейса будет отображать факт обнаружения установки соединения. &D2 -- сигнал DTR последовательного интерфейса установленный в 0 будет заставлять модем прерывать связь. Это важно, именно на такое поведение, обычно, рассчитаны комуникационные программы. &S0 -- сигнал DSR всегда активен, только если модем не выключен. Hеактивный сигнал DSR может восприниматься как отсутствие модема. \E0 -- отключение "эхо" символов при передаче данных. Это важно, именно на такое поведение рассчитаны коммуникационные программы. В частности, при неправильно настройке не смогут нормально работать протоколы PPP, Hydra и другие двунаправленные протоколы. А Z-modem работать будет, именно поэтому многие пользователи Fidonet обычно не замечают неправильной настройки модема. Hо протоколы вроде Hydra у них не работают. В модемах US Robotics (переименована в 3COM) эта команда эквиэвалентна F1 -- отключить эхо. \Q3 -- разрешить аппаратное (RTS/CTS) управление потоком. Это важно, иначе возможна потеря принимаемых данных. Данная настройка затрагивает управление потоком данных между модемом и компьютером. Стоит обратиться к инструкции от модема для выяснения какие конкретно команды используются для настройки конкретного модема. Так что не стоит покупать модемов, к которым не прилагается никакой документации, как это сейчас стало модно -- Plug'And'Play... По опыту общения с пользователями fidonet, автору известно, что большая половина всех используемых модемов не настраивалось вообще, или что хуже, настроены неправильно. Так очень часто положительно на качестве связи, или даже просто на возможности связь установить, сказывается просто сброс настроек модема на заданные изготовителем по-умолчанию, с последующим их запоминанием. Это делается командой AT&F&Y0&W0<Enter>. По возможности, отнеситесь внимательно к настройке эксплуатируемых вами модемов, источних всех проблем чаще всего именно настройки модема, а на сам модем. Пользователи Windows обычно проблем не замечают, только потому, что "драйвер модема" содержит необходимые строки инициализации, используемые, например, при установке "удалённого соединения". Hо настройки эти в модеме не запоминаются, и для Linux важно их иметь в самом модеме, или же конфигурировать модем при каждом рестарте ОС. Скорость порта тоже, для модема работающего по протоколу V42Bis или MNP, болeе чем 4-х кратная относительно скорости соединения, не имеет смысла. Это обусловлено тем, что используемые модемом алгоритмы сжатия инфомации не обеспечивают более чем 4-х кратного сжатия ни в каком случае. При использовании PPP протокола, обычно, /но не обязательно/, используется сжатие передаваемых данных на более высоком уровне, в компьютере, поэтому нет смысла устанавливать скорость передачи у порта значительно большую чем скорость соединения. Hо отмечу -- это /обычно/, но не обязательно. Достаточно часто, при модемном подключении к интернету сжатие явно запрещается со стороны интернет-провайдера. Интересно, с чем это связано? Типично 57600 бит/сек достаточно во всех случаях, или даже 38400 бит/сек, если модем не соединяется на большей скорости. Для FIDO всё тоже самое, поскольку обычно передаются сжатые ZIP пакеты, нет смысла устанавливать слишком высокую скорость порта -- сжатие в модеме в данном случае не работает. Установка слишком высокой скорости передачи порта уменьшает время, за которое Linux *гарантированно* должен обслужить прерывание от UART. Типично, без FIFO -- это время передачи одного байта (8 бит данных + два служебных), при наличии FIFO что-то около 4-х байт. Так что если в данный момент порт настроен на скорость 115200 бит/сек, а модем больше примерно ~30000 бит/сек не выдаёт, то есть смысл установить скорость порта в 38400 бит/сек, что дает _троекратное_ увеличение времени отведённого наобработку прерывания... Скорость порта настраивается программой setserial в linux, модем же, обычно, автоматически определяет установленную скорость порта. -- Всё, сказанное в данном письме от имени автора письма, является выражением личного мнения автора письма по обсуждаемой теме, и может не соответствовать действительности. --- [ZX] * Origin: pgp: 0D00 1E54 41D1 9753 3F41 40F7 4BBA 050B 30E8 0E4 (2:5030/827.2) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/38330e7d460f.html, оценка из 5, голосов 10
|