Программирование com-портов. Изменение буфера r/w FIFO

Aug 21, 2013 15:31

Доброго времени суток. Камраден, пост о программирование СОМ-портов в linux!

Ваяем тут одну железяку с кучей СОМ-портов, работающую под линем. И для отладки драйверов и железа ваяю программу тестирования СОМ-портов. Чтобы не изобретать велосипед за основу была взята программа linux-serial-test (рекомендую программулинку заценить нуждающимся ( Read more... )

Вопрос, linux, Программирование, Цифра

Leave a comment

Comments 35

minimumlaw August 21 2013, 11:59:01 UTC
Хм... А man fflush (или fsync) Вам не поможет?

Reply

dlinyj August 21 2013, 12:13:37 UTC
Вы путаете тёплое с мягким. Во первых, мы используем низкоуровневые функции, следовательно fflush и иже с ним тут не канают. Но, право признаюсь - это первое, что я подумал.

Но по теме, искал долго, и пока единственное, что мне удалось найти - это вот это http://www.groupsrv.com/linux/about57282.html

Там это делается примерно так:

void serial_ack()
{
write(fd, "a", 1);
#if TEST_OUTPUT_FLUSH
tcflush(fd, TCOFLUSH);
#endif
}

Но, не даёт ответа на вопрос - как менять размер внутренних буферов.

Reply

minimumlaw August 21 2013, 12:30:22 UTC
Ну ладно, fflush высоковата, но fsync-то на нашем уровне. Правда на стековерфлоу пишут что не помогает... И рекомендуют как раз tcflush...
На самом деле, сколько не писал никогда таких проблем не видел. Правда, я всегда использовал RAW режим (тот, который не дожидается перевода строки). Но беглый осмотр референсного кода говорит о том, что и там оно...

А размер буферов - скорее всего никак. Надо поковырять ядерный код, но там скорее всего ничего путнего не будет. Ибо последовательный порт и Linux это не просто символьное устройство, а еще и termios.

Reply

dlinyj August 21 2013, 12:44:26 UTC
Вот здесь говорят http://ru-radio-electr.livejournal.com/1158236.html?thread=22388060#t22388060 что поменять программно можно...

Reply


tanner_of_kha August 21 2013, 12:12:56 UTC
Утилита setserial имеет параметры rx_trigger и tx_trigger. Может, их установка в "1" для нужного порта поможет?

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

Reply

dlinyj August 21 2013, 12:39:01 UTC
Утилита setserial имеет параметры rx_trigger и tx_trigger. Может, их установка в "1" для нужного порта поможет?

Ценный коммент, спасибо! Осталось теперь посмотреть её исходники и поглядеть как же она это делает :))0

Reply


minimumlaw August 21 2013, 12:21:43 UTC
А еще, попробуйте поиграться вот этим... Не уверен, что оно сказывается на записи, но чтение точно будет блокироваться до получения 128 байт.

// block for up till 128 characters
newtio.c_cc[VMIN] = 128;

// 0.5 seconds read timeout
newtio.c_cc[VTIME] = 5;

А так же рискну порекомендовать http://www.tldp.org/HOWTO/Serial-Programming-HOWTO/

Reply

dlinyj August 21 2013, 12:26:38 UTC
Тут важно понимать, что блокироваться до получения 4-х байт из БУФЕРА! А не из СОМ-порта! Аналогично со write, так же запись в буфер

http://en.wikibooks.org/wiki/Serial_Programming/termios эта ссылка более полная.

Reply


tzirechnoy August 21 2013, 14:03:49 UTC
Вообще, man termios, разумеется. По ссылкам из него тожэ можно походить -- но termios более портабелен, чем ioctl.

PS Да, а зачем Вам C для этой задачи? А то какой-нибудь tcl имеет более простые встроенные средства для простого контроля COM-порта.

Reply

dlinyj August 21 2013, 14:10:51 UTC
Потыкайте носом, где в манах сказано как менять размер буфера?

>>PS Да, а зачем Вам C для этой задачи? А то какой-нибудь tcl имеет более простые встроенные средства для простого контроля COM-порта.

Для порта может быть,а для теста единовременной работы 16 СОМ-портов?

Reply


anonymous August 21 2013, 15:28:27 UTC
А http://www.tldp.org/HOWTO/Serial-Programming-HOWTO/ вот это не в тему?

Reply

dlinyj August 21 2013, 20:45:40 UTC
Я гуглом умею пользоваться, и разумеется это изучил.

Reply


Leave a comment

Up