The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Чтение из COM порта - исключительно по одному байту. Почему ?"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"Чтение из COM порта - исключительно по одному байту. Почему ?"  +/
Сообщение от greenetc (??) on 10-Май-12, 14:48 
Есть serial устройство - скорость работы 9600. От устройства приходят данные в пакетах  разной динный Если работать так :
  
int fd;
struct termios oldtio, newtio;
fd = open(DEVICE, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK);

fcntl(fd, F_SETFL,0);
struct termios attr;
tcgetattr(fd, &attr);
attr.c_cflag = B9600 | CS8 | CLOCAL | CREAD;
attr.c_lflag &= ~ICANON | ~ISIG ;
attr.c_cc[VMIN] = 0;
attr.c_cc[VTIME] = 1;
tcsetattr(fd, TCSANOW, &attr);
tcflush(fd, TCIFLUSH);

struct timeval timeout = { 0 };
int result = select(fd+1, &con, 0, 0, &timeout);

Вывод : #stty -F /dev/ttyUSB0

speed 9600 baud; line = 0;
eof = ^A; min = 0; time = 1;
-cread
-brkint -icrnl -imaxbel
-opost -onlcr
-isig -icanon -iexten -echo -echoe -echok -echoctl -echoke

То читает исключительно по одному байту, то есть select сигналит на каждый байт приходящий в буфер. Если [VMIN] = 8 , например, то приходит пачкой (что и понятно), но при этом все пакеты меньше 8 естественно накапливаются пока не станет 8 в буфере - так не устраивает.
Отключаю ICANON вообще переставет читать, запись при этом идет отлично. Подскажите кто знает , что можно покрутить в настройках порта.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Чтение из COM порта - исключительно по одному байту. Почему ?"  +/
Сообщение от Help (??) on 11-Май-12, 11:31 
Думаю что никак. Как он(serial port) по вашему должен узнать какой длины сейчас должен
прийти пакет?

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Чтение из COM порта - исключительно по одному байту. Почему ?"  +/
Сообщение от greenetc email(??) on 23-Май-12, 19:43 
> Думаю что никак. Как он(serial port) по вашему должен узнать какой длины
> сейчас должен
> прийти пакет?

Не в этом дело ... пускай даже делаю 8 байт от устройства ... в cutecom и minicom они приходят одной строкой ... то есть read(fd ... ) возвращает 8 байт .. а вот в моей ситуации всегда read(fd .. ) возвращает 1 байт .. и select срабатывает подряд 8 раз .. вот в чем дело

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Чтение из COM порта - исключительно по одному байту. Почему ?"  +/
Сообщение от greenetc email(??) on 23-Май-12, 19:54 
>> Думаю что никак. Как он(serial port) по вашему должен узнать какой длины
>> сейчас должен
>> прийти пакет?
> Не в этом дело ... пускай даже делаю 8 байт от устройства
> ... в cutecom и minicom они приходят одной строкой ... то
> есть read(fd ... ) возвращает 8 байт .. а вот в
> моей ситуации всегда read(fd .. ) возвращает 1 байт .. и
> select срабатывает подряд 8 раз .. вот в чем дело

посмотрел что cutecom делает с портом, настройки ... он ставит VMIN=60 , VTIME=1 . Это помогает если у себя так же настраиваю, НО ... медленнее идет чтение как то .. причем на глаз заметно даже ...

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Чтение из COM порта - исключительно по одному байту. Почему ?"  +/
Сообщение от Аноним email(??) on 25-Май-12, 01:29 
>[оверквотинг удален]
>>> прийти пакет?
>> Не в этом дело ... пускай даже делаю 8 байт от устройства
>> ... в cutecom и minicom они приходят одной строкой ... то
>> есть read(fd ... ) возвращает 8 байт .. а вот в
>> моей ситуации всегда read(fd .. ) возвращает 1 байт .. и
>> select срабатывает подряд 8 раз .. вот в чем дело
> посмотрел что cutecom делает с портом, настройки ... он ставит VMIN=60 ,
> VTIME=1 . Это помогает если у себя так же настраиваю, НО
> ... медленнее идет чтение как то .. причем на глаз заметно
> даже ...

Попробуйте так сконфигурировать:

$ stty 9600 ignbrk -brkint -icrnl -imaxbel -opost -isig -icanon -iexten -echo noflsh </dev/ttyS0

у меня была проблема с программатором по COM-порту, такая конфигурация помогла.
взято отсюда: http://www.radiokot.ru/forum/viewtopic.php?p=869455&sid=5c85...

это конечно наобум, но вдруг поможет -- тоже была проблема именно со скоростью, при чем пересылка вообще останавливалась

если вдруг поможет -- то можно тогда точно определить научным тыком, какая опция влияет, и потом почитать, что она делает :)

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "Чтение из COM порта - исключительно по одному байту. Почему ?"  +/
Сообщение от Alex_S (??) on 25-Май-12, 05:23 

> посмотрел что cutecom делает с портом, настройки ... он ставит VMIN=60 ,
> VTIME=1 . Это помогает если у себя так же настраиваю, НО
> ... медленнее идет чтение как то .. причем на глаз заметно
> даже ...

  время можно strace-ом попробовать оценить, кстати

  ты какого результата хочешь в итоге ?
  хочешь буферизации - задирай таймауты и смирись с задержкой
  хочешь скорости - выгребай по одному байту , ничего страшного в этом нет
  

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру