Чтение последовательного порта Linux - можно ли изменить размер входного буфера?

Я пишу приложение на Ubuntu Linux на C ++ для чтения данных с последовательного порта. Он работает успешно с помощью моего кода вызоваselect() а потомioctl(fd,FIONREAD,&bytes_avail) чтобы узнать, сколько байтов доступно, прежде чем, наконец, получить данные, используяread().

Мой вопрос таков: каждый разselect возвращается с данными, число доступных байтов сообщается как 8. Я предполагаю, что это размер буфера, установленный где-то, и что select возвращает уведомление пользователю, когда этот буфер заполнен.

Я новичок в Linux как разработчик (но не новичок в C ++), и я попытался (безуспешно) исследовать, возможно ли изменить размер этого буфера, или даже если мои предположения верны. В моем приложении синхронизация имеет решающее значение, и я должен быть предупрежден всякий раз, когда в буфере чтения появляется новый байт. Возможно ли это, не углубляясь в код ядра?

 Rhexis30 мая 2012 г., 14:38
Извините, я неправильно прочитал: S
 Rhexis30 мая 2012 г., 14:05
Почему бы не использовать указатели?
 mathematician197530 мая 2012 г., 14:29
Я не понимаю? Насколько я знаю, я ничего не могу сделать, пока select () не вернется, и в этот момент я прочитал данные из буфера. К этому времени прибыло 8 байтов, и я хотел получать уведомление только после 1 байта. Я что-то пропустил

Ответы на вопрос(2)

Решение Вопроса

TIOCSSERIAL, который позволяет изменять как глубину приемного буфера, так и глубину приемного буфера (среди прочего). Максимальные значения зависят от вашего оборудования, но если в игре 16550A, максимальная глубина буфера равна 14.

Вы можете найти код, который делает что-то похожее на то, что вы хотите сделатьВо

Оригинальная ссылка испортилась:http: //www.groupsrv.com/linux/about57282.htm Новый придется делать, пока я не напишу другой или не найду лучший пример.

 mathematician197530 мая 2012 г., 17:42
Прошу прощения, JimR - он работает, если я отключил настройку аппаратного контроля CRTSCTS. Linux dev - это новый мир для меня, и это тяжело! Большое спасибо за вашу помощь
 mathematician197530 мая 2012 г., 16:58
Это полезно для меня, так как я не знал о TIOCSSERIAL, но, к сожалению, единственный элемент в serial_struct, который, кажется, полезен, это целое число xmit_fifo_size, которое я установил в 1, но, к сожалению, все еще предупреждает меня только после получения 8 байтов. Ну что ж...
 Craig McQueen07 авг. 2013 г., 04:52
Я никогда не слышал оTIOCSSERIAL до. Это относится к последовательной поддержке Linux в целом или только к конкретным драйверам? Насколько широко это реализовано в различных последовательных драйверах Linux? Где хорошее место для документацииTIOCSSERIAL и другиеioctls?
 JimR07 авг. 2013 г., 13:22
@ CraigMcQueen: я не использовал его несколько лет с тех пор, как модемы, подключенные к последовательному порту (коммутируемые интернет-провайдеры, коммутируемые кредитные карты / терминалы проверки и т. Д.) Выходили из моды, поэтому мои знания не подходят для этой задачи. man ioctl и man ioctl_list плюс копание заголовочных файлов и задание вопросов - вот как я начал работать. Существует текстовый коммуникационный терминал с именем minicom, у которого есть доступный источник. Я многому научился из этого.
 John U09 мая 2017 г., 12:38
Я думаю, что ссылка испортилась.

труктуры termios. Некоторая информацияВо, особенно в разделе 3.2.

 ForceMagic11 окт. 2012 г., 05:48
Я не понимаю, как это связано с вопросом, который задают. Я посмотрел на раздел 3.2, и не очевидно, как это могло бы помочь ему. Может быть, вы могли бы объяснить больше свои мысли. Кроме того, никогда не плохая идея скопировать часть кода, о которой вы говорите, в случае разрыва ссылки.

Ваш ответ на вопрос