|
FT232R - как передать большой пакет |
|
|
|
Mar 11 2012, 07:37
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Цитата еще надо проверить выводы RTS/CTS - не висят ли в воздухе по мануалу они могут висеть. Вся проблема, как я думаю, в тупом переполении буфера микрухи, т.е. по юсб пакет быстро передается на фт232, которая начинает его передавать на скорости много меньшей. Верна ли эта версия? Если да, то осталось узнать размер буфера и передавать пакет частями.
Сообщение отредактировал Alt.F4 - Mar 11 2012, 07:38
|
|
|
|
|
Mar 11 2012, 11:03
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(Alt.F4 @ Mar 11 2012, 11:37)  Вся проблема, как я думаю, в тупом переполении буфера микрухи, т.е. по юсб пакет быстро передается на фт232, которая начинает его передавать на скорости много меньшей. Верна ли эта версия? Если да, то осталось узнать размер буфера и передавать пакет частями. Крайне сомнительная версия. Буфера там маленькие (256/128 байтов), обмен по USB гораздо быстрее, чем типичный обмен по UART. Я подобного эффекта (потерь данных и замедления передачи) не наблюдал, используя и управление потоком (при 921600), и без управления (230400), правда, блоки не 250 кило, но десятки килобайтов лил. По простой "copy" и терминалом (teraterm).
|
|
|
|
|
Mar 11 2012, 11:56
|

pontificator
     
Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483

|
Цитата(Alt.F4 @ Mar 11 2012, 05:44)  Столкнулся с проблемой передачи пакета 250КБ при помощи терминальной программы и FT232R на скорости 115200. У винды наличествует баг в USB драйвере класса CDC. При попытке передать через виртуальный COM порт файл размером более 8 кбайт, Винда начинает глючить именно так, как вы описали. Я это проверял на Вынь 7 путем замены CDC драйвера на драйвер некой немецкой фирмы. Названия фирмы не помню, но не в этом суть: немецкий драйвер работал как часы, он без малейших глюков передавал файлы любого размера. Однако демо версия, котороую я гонял, имела ограничения по времени на 30 дней, а покупать рабочую версию за несколько тысяч евро меня жаба задушила. Поэтому я просто стал резать свои файлы на куски размером не более 8 кБайт и передавать файл кусками, что и вам советую. Магическое число 8 кБайт - это размер буфера в USB драйвере. После заполнении буфера виндовский драйвер глючит, очевидно, по той причине, что мелкософтовские программисты опять облажались с указателями.
|
|
|
|
|
Mar 11 2012, 12:36
|

pontificator
     
Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483

|
Цитата(aaarrr @ Mar 11 2012, 22:45)  VCP - это тоже их собственные драйверы, к виндовому usbser.sys ни малейшего отношения они не имеют. Я полагаю, что VCP - это прослойка, которая в конечном счете все равно опирается на виндовые CDC драйвера. Вот, кстати, у ТС будет хорошая возможность это косвенно проверить: если после нарезки файла на куски по 8 кбайт глюки исчезнут, то это будет изрядным свидетельством, что глюки возникали именно в CDC драйверах, поскольку маловероятно, что программисты FTDI наступили точно на те же грабли, что мелкософтовские.
|
|
|
|
|
Mar 11 2012, 13:01
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(=AK= @ Mar 11 2012, 16:36)  Я полагаю, что VCP - это прослойка, которая в конечном счете все равно опирается на виндовые CDC драйвера. Нет там ничего общего с CDC - собственный закрытый протокол и свои драйверы, которым отнюдь не нужно ни на что опираться. Цитата(=AK= @ Mar 11 2012, 16:36)  если после нарезки файла на куски по 8 кбайт глюки исчезнут, то это будет изрядным свидетельством, что глюки возникали именно в CDC драйверах. Едва ли в каком-либо из использованных ТС терминалов данные отправляются столь экстравагантным способом (кусками более 8кБайт).
|
|
|
|
|
Mar 11 2012, 13:27
|

pontificator
     
Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483

|
Цитата(aaarrr @ Mar 11 2012, 23:31)  Нет там ничего общего с CDC - собственный закрытый протокол и свои драйверы, которым отнюдь не нужно ни на что опираться. У любого виртуального СОМ порта есть очень много общего с CDC. Поэтому, чтобы не изобретать велосипед, его логично сделать именно как прослойку между специфической железякой и CDC. Цитата(aaarrr @ Mar 11 2012, 23:31)  Едва ли в каком-либо из использованных ТС терминалов данные отправляются столь экстравагантным способом (кусками более 8кБайт). Как они сейчас передаются - не представляет большого интереса. Интерес представляет то, как их надо передавать, чтобы не было глюков. Мое предложение - передавать блоками не более чем по 8 кБайт. Это гарантирует, что буфер виндового CDC драйвера никогда не переполнится, поскольку микрософтовский баг состоит именно в ошибочной обработке указателей буфера в ситуации, когда надо его "зациклить", т.е. перейти из конца буфера в начало. У немцев с этим проблем нет, они организовали FIFO при помощи кольцевого буфера корректно. А у мелкомягких с этим проблемы, поэтому до тех пор, пока буфер не заполнился, все работает, а после 8 кБайт - глюки. Передача блоками по 8 кБайт гарантирует, что буфер никогда не переполнится. Окончание блока означает, что транзакция завершилась, поэтому для следующего блока драйвер перейдет в исходное состояние и начнет укладывать данные с начала буфера. А в случае передачи массива рамерами более 8 кБ без разбивки на блоки драйвер вынужден переходить из конца 8-килобайтного буфера в начало, а там у мелкомягких баг.
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|