URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9454
[ Назад ]

Исходное сообщение
"Чтение из COM порта - исключительно по одному байту. Почему ?"

Отправлено greenetc , 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 вообще переставет читать, запись при этом идет отлично. Подскажите кто знает , что можно покрутить в настройках порта.


Содержание

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


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

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


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

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


"Чтение из COM порта - исключительно по одному байту. Почему ?"
Отправлено Аноним , 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...

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

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


"Чтение из COM порта - исключительно по одному байту. Почему ?"
Отправлено Alex_S , 25-Май-12 05:23 

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

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

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