LINUX.ORG.RU

COM-порт: размер буфера


0

0

    К моему COM-порту подключено устройство, передающее
около 35 Кбит/с на скорости 38,4 Кбод. Моя программа пытается
всё это вычитать и обработать, но справляется только в первые 1-2 секунды работы,
затем из порта читается всякий мусор. Есть подозрение, что это переполнение буфера порта.
    Внимание, вопрос: Как прочитать/изменить размер буфера COM-порта?
    Заранее благодарен.

Если используется 16550, то почерпнуть данные о состоянии FIFO можно из третьего регистра (базовый адрес + 2) если установлен младший бит то используется FIFO, два старшие бита показывают размер очереди: 00 - 1 байт; 01 - 4 байта; 10 - 8 байт; 11 - 16 байт. Контролировать ошибки можно через 6-й регистр (базовый адрес + 5): бит 1 - ошибка переопределения данных (были получены новые данные, в следствии чего старые были утеряны), бит 2 - ошибка паритета (вероятно, данные были искажены при передаче), бит 3 - Ошибка кадрирования (рассинхронизация).

TaranSergey
()

Маловероятно, что из-за размера буфера.

читай:

1. man stty

2. man termios

Что за девайс? Протокол?

По моему одно другому противоречит: "35 Кбит/с на скорости 38,4 Кбод". Ты уверен, что скорости, девайса и скорость СОМ порта, которую ты выставляешь совпалают? Если нет, то по определению ничего нормального не должно быть.

binr ★★
()

Попробуй так:
cat /dev/ttyS0 >/tmp/файл 
и посмотри в этом файле не появляется ли мусор.

Или вообще через именованный пайп попробуй читать данные. то есть запусти:
cat /dev/ttyS0 >/tmp/пайп 
А ты прогой уже из /tmp/пайп читай данные.

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

>А ты прогой уже из /tmp/пайп читай данные.
В этом случае все данные будут сразу попадать в этот пайп? И буфер забиваться не будет?
У пайпа есть свой буфер нормального размера?

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

>почерпнуть данные о состоянии FIFO можно из третьего регистра (базовый адрес + 2)
  Дело в том, что я вообще не читаю/пишу регистры порта, а
вся работа с портом делается через вызовы open/close, fcntl и iocntl.
  Поэтому я рассчитывал на то, что буфер приёма драйвера порта будет в районе килобайта.

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

  >По моему одно другому противоречит: "35 Кбит/с на скорости 38,4 Кбод"
  Девайс на основе микроконтроллера, протокол собственный. Передача идёт на нормальной скорости - это точно,
я имел в виду, что на линии передача идёт очень плотно, и порту приходится читать очень много данных.

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

>около 35 Кбит/с на скорости 38,4 Кбод

Всё таки больше 30720 килобит в сек на скорости 38.4 не получить.

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

   >cat /dev/ttyS0 >/tmp/файл
   Попробовал. При выполнении этой команды порт переводится в состояние "запись", т.е. на RTS выставляется единица, а а на сигнальной - 0.
В результате сигнал с устройства на закороченной портом линии просаживается. Не понимаю, почему порт так себя ведёт.

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

> Девайс на основе микроконтроллера

Тактовая какая? Скорость работы USART обычно напрямую зависит от тактовой. Если у тебя кварц имеет чуть не такую частоту, как у порта ПК, могут быть проблемы. Общепринятым считается максимальное отличие 5%.

> на линии передача идёт очень плотно

Попробуй 2 стоповых, иногда помогает (если у тебя 1).

> порту приходится читать очень много данных

Модемы работают на 115200, и ничего не искажается и не теряется. Так что дело не в порте.

anonymous
()

  Наконец-то я разобрался. Благодарю всех, кто проявил участие.
  В действительности размер буфера COM-порта при использовании устройства /dev/ttySx у меня равен 4Кб.
Лично моя проблема была, как часто бывает, в голове :-)

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