Должны ли данные пропадать? Наверно зависит от управления потоком, как согласована концепция управления последовательным устройством со стороны tty и со стороны USB-устройства. В tty есть вариант без управления потоком, с аппаратным управлением (RTS/CTS или его соотв. эмуляцией) и управляющими кодами xon/xoff. И так, что должен делать последовательный порт без управления потоком, к которому подключено устройство, шлющая массу данных, а потребитель ее не забирает? Логично, что складировать больше размера буфера не имеет смысла, значит только терять.
Ну, в общем-то логично, это объясняет потерю данных.
Но тогда получается, что хост должен запрашивать данные (слать токены IN) бесконечно (во всяком случае до тех пор, пока устройство отвечает на них данными).
А получается примерно так (цифры раз от раза могут немного варьироваться):
Без ошибок принимается 84'992 Б (166 пакетов по 512 Б).
Затем теряется 3'584 Б (7 пакетов).
Затем опять идут правильные данные (1004 Б - то, что успевает считать "read" до его возврата (не кратно 512 Б)).
Все "read" возвращают странное число 4095. Всего вызовов "read" было - 21.
После этого "read" не вызываются, но всего по USB шине передано 412'672 Б (806 пакетов), это больше чем 21*4095, но
много меньше, чем плата готова переслать (512 МБ).
Еще вот пример включения на коленке утилитой stty
Пробовал таким способом (ioctl тоже попробовал) - видно, что аппаратный контроль потока вроде бы включился (если я правильно понимаю куда смотреть):
stty -a -F /dev/ttyACM0
speed 115200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon iexten -echo -echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
, но данные по-прежнему теряются (как описано выше), поведение не изменилось.