[STM32Generic/HAL] Serialusb TX/RX Speed ​​Проблема

Пито
Пн 17 июля 2017 г. 8:15 утра
Это короткий набросок, чтобы продемонстрировать проблему, исправленная патчем Стива в Libmaple: // USBSERIAL TX PROBLEM DEMONSTRATION // Pito 7/2017 #include "Arduino.h" void setup() { Serial.begin(115200); delay(3000); } #define TXCHARS 1000000 void loop() { uint32_t i; uint8_t x = 85; uint32_t elapsed = micros(); for (i = 0; i < TXCHARS; i++) { Serial.write(x); } elapsed = micros() - elapsed; Serial.println("***"); Serial.print("USB TX speed = "); Serial.print((1000.0 * TXCHARS) / elapsed, 2); Serial.println(" KBytes/sec"); delay(1000); }

Стивестронг
Пн 17 июля 2017 г. 8:31
[Пито - Пн 17 июля 2017 г. 8:15] - Исправлен Libmaple: *** USB TX speed = 213.34 KBytes/sec

Даниэфф
Пн 17 июля 2017 г. 15:08
Несколько недель назад я также добавил буферизацию USB TX, https: // github.com/danieleff/stm32gener ... 8154715833, https: // github.com/danieleff/stm32gener ... B86394C84E

Ваш код дает мне:
USB TX Speed ​​= 308.41 кбайт/сек

Пито
Ср. 19 июля 2017 г. 11:10
Большой! Я попробую, я обновил свой местный житель 24.6. Так что, может быть, я скучаю по твоему патчу..

Кстати, я собрал тест на черный F407 @168mhz под моим старым либмапелом (исправлен вручную с патчем Стива), и я получаю 1013-1064KB/SEC..

Пито
Ср. 19 июля 2017 г. 11:25
Я заменил ядра и систему на ваш последний, и я получаю (Black F407ze @168mhz) *** USB TX speed = 64.87 KBytes/sec

Пито
Пт 21 июля 2017 г. 7:47 утра
@Daniel: какая версия компилятора вы используете? Даже с вашим ванильным репо я не могу получить более 64 КБ..

Даниэфф
Пт 21 июля 2017 г. 8:12 утра
Я думаю, что это 6-2017-q1-update от https: // Разработчик.рука.com/с открытым исходным кодом/g ... /Загрузки, Самым новым является 6-2017-Q2-Update

Также CDC_SERIAL_BUFFER_SIZE по -прежнему 128 в STM32/CORES/ARDUINO/USB/CDC/USBD_CDC_IF.h, повышение, которое может помочь.

Пито
Пт 21 июля 2017 г. 9:25 утра
ОК, с CDC_SERIAL_BUFFER_SIZE 512 Я получаю сейчас с F407
Удален
Стандартный компилятор.

С cdc_serial_buffer_size 2048 я получаю с F407 730-994KB/SEC.
Удален

Обновление: с, возможно, более реалистичным сценарием - с 1 -милыми чарсом, отправленным на терминал Teraterm (Win7) #define TXCHARS 1000000

Пито
Sun 23 июля 2017 12:13
Большие буферы быстрые, но TX теряет данные :(

Во время управления демо -версией TEK против эмулятора Teraterm Tek
http: // www.STM32duino.com/viewtopic.PHP ... = 20#p31835

Размеры буфера, превышающие 256 байтов, показывают коррупции на картинке..

Libmaple USB работает, не уверен в размере буфера там.
Может быть, что терратерм также вызывает это..

Пито
Солнце 23 июля 2017 г. 18:31
Кажется, мои вышеупомянутые результаты (таблицы со скоростями) были неправильными.. :зло:
Teraterm не получает все 1 -мильные ChARS с большим буфером CDC, но его доля.
Чем больше буфер в CDC, тем меньше данных я получаю.
Поэтому общее время для TX было меньше, а скорость TX была выше.

Я проверил это, введя входящие байты в файл.
Я получаю 1 -миллиметровый Chars, полученный только с CDC_SERIAL_BUFFER_SIZE = 128 (то есть скорость TX = 64 КБ/сек).

Я удалил столы.

PS: с Libmaple Last и его настройками CDC я получаю 1-миний заряд с TX Speed ​​120-170KB/SEC.

Пито
Сб 12 августа 2017 г. 9:50 утра
Любые мысли об этом?
Было бы здорово, если бы более крупные размеры буфера работали..
PS: Как написал Стив, его буфер 2 кб.

victor_pv
Сб 12 августа 2017 г. 14:34
[Пито - Сб 12 августа 2017 г., 9:50 утра] - Любые мысли об этом?
Было бы здорово, если бы более крупные размеры буфера работали..
PS: Как написал Стив, его буфер 2 кб.
С какими ядрами вы испытывали байты? Я тестировал серийную скорость в Libmaple F4 и заметил из хоста -> MCU он теряет байты, если хост отправляет быстрее, чем может получить эскиз.

Пито
Сб 12 августа 2017 г. 14:45
С STM32GENERIER (этой темой) я вижу потерю данных, когда TX через USB от F4 до Teraterm с CDC_SERIAL_BUFFER_SIZE (в STM32/CORES/ARDUINO/USB/CDC/USBD_CDC_IF.час) > 128bytes. Потеря составляет до 50% данных с большими буферами.
Вы не видите ничего плохого, если не начнете регистрировать входящие данные в файл (в Teraterm) и не считать байты в этом файле.
Используемый тест: http: // www.STM32duino.com/viewtopic.PHP ... 354#P31552
Почему нам нужен больший буфер? Потому что TX медленно - 64 КБ/сек только с 128 баллов.


TX Libmaple через USB от F4 до Teraterm в размере буфера запаса (2 КБ согласно информации Стива) не показывает потери (скорость около 150-220 кб/с).

Существует тест на скорость USB RX, написанный Pauls, я попробовал с теми же результатами (Maplem), что и в следующей ссылке

https: // www.PJRC.com/teensy/bender_u ... ceive.HTML

Кстати - если бы был талантливый программист, который может написать аналогичный эталон (см. Pauls Dos Side Source) и для TX, это было бы здорово!

victor_pv
Сб 12 августа 2017 г. 16:09
[Пито - Сб 12 августа 2017 г. 14:45] -
Существует тест на скорость USB RX, написанный Pauls, я попробовал с теми же результатами (Maplem), что и в следующей ссылке

Это тот же тест, который я делал, когда заметил, что Libmaple F4 выбросит входящие байты, если эскиз не выберет их.
Если вы откроете серийный порт, не захотите читать и отправлять в утилиту командной строки Павла, он будет продолжать идти и идти, даже если наброски не волнует вообще читать.

Тест на TX был бы отличным. Возможно, где -то уже есть инструмент.

На Libmaple F4 я думаю, что я исправил, по крайней мере, не сбрасывает все, но мне нужно подтвердить, что я вообще не пропускаю байт.
Я посмотрю, смогу ли я взглянуть на общий TX. Какие размеры буфера вы тестировали, которые наверняка упадут на байты?
В ядре Libmaple, из -за того, как написан код, буфер должен быть точной силой 2.

Пито
Сб 12 августа 2017 г. 16:59
Я посмотрю, смогу ли я взглянуть на общий TX. Какие размеры буфера вы тестировали, которые наверняка упадут на байты? CDC_SERIAL_BUFFER_SIZE (в STM32/CORES/ARDUINO/USB/CDC/USBD_CDC_IF.ч) размер, который работает нормально, 128.

Это я проверил с отсутствующими байтами: 256, 512, 1024, 2048, 4096, 8K, 16K, 32K на F4 и то же самое до 16K на F103 (так что это не только около F4).
При разговоре пропавших байтов - это не несколько байтов, а сотни килобитов..

Я опубликовал результаты несколько недель назад (см. Мои предыдущие сообщения здесь, в этой теме) со скоростью до 1 МБ/с для F4 и 450 кб/с для F103, пока не начал анализировать объем передаваемых данных.
Это показало, что большие скорости были достигнуты, потому что передача имела лишь часть количества данных и закончилась плавно раньше, поэтому скорость были такими фантастическими фигурами :)

Поэтому я удалил результаты, чтобы не вызывать ложные ожидания (пока не фиксировано).
Я обнаружил, что, несмотря на эмулятор Tek, где более крупные изображения, которые я транслировался в TEK через USB.

victor_pv
Сб 12 августа 2017 г. 18:07
[Пито - Сб 12 августа 2017 г. 16:59] - Я посмотрю, смогу ли я взглянуть на общий TX. Какие размеры буфера вы тестировали, которые наверняка упадут на байты? Размер, который работает нормально, 128.

Это я проверил с отсутствующими байтами: 256, 512, 1024, 2048, 4096, 8K, 16K, 32K на F4 и то же самое до 16K на F103 (так что это не только около F4).
При разговоре пропавших байтов - это не несколько байтов, а сотни килобитов..

Я опубликовал результаты несколько недель назад (см. Мои предыдущие сообщения здесь, в этой теме) со скоростью до 1 МБ/с для F4 и 450 кб/с для F103, пока не начал анализировать объем передаваемых данных.
Это показало, что большие скорости были достигнуты, потому что передача имела лишь часть количества данных и закончилась плавно раньше, поэтому скорость были такими фантастическими фигурами :)

Поэтому я удалил результаты, чтобы не вызывать ложные ожидания (пока не фиксировано).
Я обнаружил, что, несмотря на эмулятор Tek, где более крупные изображения, которые я транслировался в TEK через USB.
Бьюсь об заклад, было приятно видеть 1 МБ/с, пока вы не узнали, что их куда -то уронили : D

Я только что нашел этот инструмент:
http: // www.serialporttool.com/commecho.htm

Я собираюсь проверить это, я понимаю, что он повторит все, что он получит, плюс это имеет значение, поэтому, если мы отправим, скажем, 1 МБ, мы должны получить обратно 1 МБ, плюс программа должна показать, получили ли Windows 1 МБ. Давайте посмотрим...

Пито
Сб 12 августа 2017 г. 18:19
Попробуйте тест в первом посте здесь..

victor_pv
Сб 12 августа 2017 г. 11:45
Эта программа отправляет порт тот же, что и получает. Из -за этого мне пришлось сделать некоторые мофиции с эскизом, чтобы он тоже прочитал байты RX.
Также это позволяет мне подсчитать оба байта отправили трубку и полученные обратно.

Я провел несколько тестов, позволяя ему дольше ждать дольше, чтобы увидеть, получит ли он какие -либо дополнительные байты, от какого -то заблуждения где -то, но не.
Настройка, как это. Он сообщает о 50 кб/с, это каждый путь.
Важно отметить, что либо из -за Windows, либо из -за тестовой программы в Windows, последние несколько байтов занимают несколько секунд, чтобы быть полученным обратно, я думаю, программа ждет, чтобы увидеть, может ли он заполнить буфер или что -то в этом роде. Если бы этого ожидания не было, производительность будет лучше. Но, по крайней мере, я знаю, что в этой скорости Windows получает правильное количество байтов, отправляет их обратно, и правильная сумма снова получена.
Если я повышу скорость TX, отправляя блоки вместо отдельных байтов (серийные.Print (BUF, XXXX), в какой -то момент я начинаю терять данные. Но я считаю, что это больше связано с TX Timing Out, так как есть максимальный тайм -аут для перевода и будет падать на байты, если это потребует больше, чем это.
#define TXCHARS 100000 void loop() { char buf[bufsize]; delay (10000); uint32_t n = 0; uint32_t i; uint8_t x = 85; uint32_t elapsed = micros(); for (i = 0; i < (TXCHARS); i++) { Serial.write(x); n+= Serial.readBytes (buf, bufsize); } uint32 endMillis = millis(); while ((n < TXCHARS)){ //while ((n < TXCHARS*2) & ((millis() - endMillis) < 10000)){ n+= Serial.readBytes (buf,bufsize); } elapsed = micros() - elapsed; Serial.println("***"); Serial.print("USB TX speed = "); Serial.print((1000.0 * TXCHARS) / elapsed, 2); Serial.println(" KBytes/sec"); Serial.print ("Elapse (us): "); Serial.println (elapsed,DEC); Serial.print ("Sent: "); Serial.println (TXCHARS, DEC); Serial.print ("Received: "); Serial.println (n, DEC); delay(1000); while (1){ Serial.readBytes (buf,bufsize); } }

vitor_boss
Солнце 13 августа 2017 г., 4:36
Я изменил код на это: #include "Arduino.h" #define TXCHARS 100000 #define bufsize 100 void setup() { Serial.begin(115200); delay(2000); } void loop() { uint32_t i; uint8_t x = 85; uint32_t elapsed = micros(); uint8_t buf[bufsize]; for (i = 0; i < bufsize; i++) { buf[i] = x; } while(1) { elapsed = micros(); for (i = 0; i < TXCHARS; i++) { Serial.write(x); } elapsed = micros() - elapsed; Serial.println("***"); Serial.print("USB TX speed = "); Serial.print((1000.0 * i) / elapsed, 2); Serial.println(" KBytes/sec"); delay(1000); elapsed = micros(); for (i = 0; i < TXCHARS; i+=bufsize) { Serial.write(buf, bufsize); } elapsed = micros() - elapsed; Serial.println("***"); Serial.print("USB buffered TX speed = "); Serial.print((1000.0 * i) / elapsed, 2); Serial.println(" KBytes/sec"); delay(1000); } }

Пито
Солнце 13 августа 2017 г., 7:19
Используйте 1 -миний Chars, как в моем первоначальном тесте. #define TXCHARS 1000000

Даниэфф
Солнце 13 августа 2017 г. 11:16
В записях есть тайм -аут, как Libmaple, так что это может способствовать.
В serialusbclass написать, без знака долгой тайм -аут = millis ()+5;
Попробуйте увеличить его.

Извините, я не смог воспроизвести ошибку, но у меня нет времени тщательно проверить это.

victor_pv
Солнце 13 августа 2017 13:24
Пито, я еще не тестировал с общим, только Libmaple F4. Я буду тестировать с общим, когда у меня снова будет.

В Libmaple буферы определены в другой линии, но тот же эффект. Эти буферы по 2 КБ по умолчанию в последнем репо. Я увеличил их без особого эффекта, за исключением случаев, когда я их очень медленно.
Игра с буферами в Commecho имела более окончательный эффект, наилучшие результаты - когда общая передача, каждый отдельный кусок и коммуховые буферы были множеством множества. я.Эн. 1 -за общего количества байтов, отправленных кусочками по 100 за раз, и коммунальные буферы по 1000 каждая. Тем не менее скорость, отправляющая 1 байт за раз до 100 байтов за раз, почти такая же общая общая скорость. Я думаю, что узкое место было в Commecho, получав и отправляя обратно, но, по крайней мере, подтвердил, что все получило все для Windows и обратно.
Если я попытаюсь отправлять 1000 байтов в раз в раз, я теряю данные, потому что я думаю, что он заполняет буфер Libmaple быстрее, чем Windows, а затем TX -тайм -аут быстро переходит и не отправляет общее количество.
Мой F4 Libmaple модифицирован, поэтому он не сбрасывает Rx Bytes Evers. Текущая копия репо будет сбросить данные RX, если эскиз не читает его с той же скоростью, которая поступает из шины USB, и что хуже, он делает это без должного перемещения хвоста в буфере RX FIFO, так что вы в конечном итоге очень поврежденные данные, не просто потерянные, но полученные байты будут прочитаны перед старшими по приложению.

Я постараюсь скомпилировать эскиз, как и с общим ядром, и посмотрю, что он делает.

Пито
Sun 13 августа 2017 г. 15:07
@victor: не используйте буферы в эскизе, экспериментируйте с cdc_serial_buffer_size только plz.

Здесь это работает только с этим (сериал.readbytes () тайм -ауты через 1 секунду) for (i = 0; i < (TXCHARS); i++) { Serial.write(x); //n+= Serial.readBytes(buf, bufsize); while(Serial.available()>0) { char dummy = Serial.read(); n++; } }

vitor_boss
Солнце 13 августа 2017 г. 15:15
W10 x64 Обновление создателей. Я отключил буферы Pers в расширенных настройках COM для обоих тестов.

Изменить: я использую по умолчанию cdc_serial_buffer_size

victor_pv
Солнце 13 августа 2017 г. 9:05 вечера
Похоже на байты общих основных дамп RX, если приложение не выберет их, как Libmaple F4, и Unlinke Libmaple F1.
Функция здесь:
https: // github.com/danieleff/stm32gener ... Беременный.CPP#L150

В Libmaple F4 это перезаписывает то, что в буфере. В общем ядре он просто не сохранит входящий пакет в буфер, если нет емкости, поэтому, если в буфере, скажем, 10 байтов бесплатно, а пакет из 40 байтов будет писать первые 10 байтов, а также возвращаться. Пакет будет написан со следующим входящим пакетом, так как связь не остановлена ​​с хостом, и 30 байтов, которые не добрались до буфера, будут потеряны навсегда.
Так что это выбросит Rx, если хост отправит быстрее, чем их читает эскиз.

На TX он будет писать, пока буфер не заполнится.

Но если буфер обладает способностью только к тому, что мы хотим отправить, я считаю, что он напишет эту часть в буфере, но не вернет правильное количество байтов, которые были буферизованы, вместо этого верните 0.
я.Эн. Мы хотим отправить 100 байтов. Буфер имеет емкость на 40. Он будет буферизировать 40 и вернуть 0. Он должен вернуть 40, поэтому эскиз может знать, что произошло, и может продолжать отправлять остальные.
Это не согласно API ARDUINO:
https: // www.Ардуино.cc/en/serial/write write () вернет количество написанных байтов, хотя чтение этого номера не является обязательным Таким образом, это приведет к тому, что эскизы в конечном итоге отправляют поврежденные данные на хост, если буфер когда -либо заполняется во время передачи.

https: // github.com/danieleff/stm32gener ... Сб.CPP#L98
Это та часть функции, выполняющую это (разбивая и возвращая 0, даже если некоторые байты попали в буфер): for(size_t i=0; i < size; i++) { tx_buffer.buffer[tx_buffer.iHead] = *buffer; tx_buffer.iHead = (tx_buffer.iHead + 1) % sizeof(tx_buffer.buffer); buffer++; while(tx_buffer.iHead == tx_buffer.iTail && millis()

vitor_boss
Пн 14 августа 2017 г., 4:13
[victor_pv - Солнце 13 августа 2017 г. 9:05 вечера] - ...
Я думаю, что это можно исправить так: while(size--) { tx_buffer.buffer[tx_buffer.iHead] = *buffer; tx_buffer.iHead = (tx_buffer.iHead + 1) % sizeof(tx_buffer.buffer); buffer++; while(tx_buffer.iHead == tx_buffer.iTail && millis()

victor_pv
Пн 14 августа 2017 г., 4:30 утра
[vitor_boss - Пн 14 августа 2017 г., 4:13] -
Это может быть проще, как это: if( i

vitor_boss
Пн 14 августа 2017 г., 4:50 утра
[victor_pv - Пн 14 августа 2017 г., 4:30]] -
[vitor_boss - Пн 14 августа 2017 г., 4:13] -
Это может быть проще, как это: if( i

Пито
Пн 14 августа 2017 г. 5:57 утра
Честно говоря, я не понимаю, как мы можем «потерять» (или мы должны сбросить, сбросить или перезаписать) байты при передаче или получении через USB.

А USB Communication основана на «пакетах» где управление RX/TX выполняется через подтверждение связи (ACK/NACK/STALL PACKETS), где размеры пакетов для управления передачами (например, команда и статус) размером от 8 до 64 байтов, и Размер пакета полезной нагрузки максимум 1024 байта (фактически 8, 16, 32, 64, 512, 1023 или 1024 на основе типа передачи).

Не существует больших размеров пакетов, afaik (пожалуйста, поправьте меня).

Когда мы устанавливаем буфер RX на буфер 1024 и TX на 1024 (совершенно возможные размеры для любого STM32) мы не должны отбрасывать/сбрасывать/перезаписать каких -либо байтов, и поэтому мы не можем терять байты при выполнении TX или RX через USB..
:?

victor_pv
Пн 14 августа 2017 г. 15:27
[Пито - Пн, 14 августа 2017 г. 5:57 утра] - Честно говоря, я не понимаю, как мы можем «потерять» (или мы должны сбросить, сбросить или перезаписать) байты при передаче или получении через USB.

А USB Communication основана на «пакетах» где управление RX/TX выполняется через подтверждение связи (ACK/NACK/STALL PACKETS), где размеры пакетов для управления передачами (например, команда и статус) размером от 8 до 64 байтов, и Размер пакета полезной нагрузки максимум 1024 байта (фактически 8, 16, 32, 64, 512, 1023 или 1024 на основе типа передачи).

Не существует больших размеров пакетов, afaik (пожалуйста, поправьте меня).

Когда мы устанавливаем буфер RX на буфер 1024 и TX на 1024 (совершенно возможные размеры для любого STM32) мы не должны отбрасывать/сбрасывать/перезаписать каких -либо байтов, и поэтому мы не можем терять байты при выполнении TX или RX через USB..
:?
Вы правы, пито, но так это должно работать, но не всегда так реализовано. В общем ядре каждый пакет, который отправляется хост, заполняется незаметно, даже если он не подходит в буфере. Поэтому, если пакет не подходит, он остается в оперативной памяти USB -устройства, чтобы быть перезаписанным следующим пакетом, отправленным хостом.
Libmaple F1 остановит вклейки пакетов, когда буфер будет заполнен, поэтому хост должен выдержать. В Libmaple F4 Serialusb, который не является на самом деле Libmaple, поскольку он был добавлен Aeroquad из стандартной периферийной библиотеки, каждый пакет заполняется независимо от того, подходит ли он в буфере или нет.
Я уже изменил это (Libmaple F4), так что он не ACK, когда буфер заполнен, и, как только буфер имеет емкость для еще 1 пакета, он заставляет предыдущий, и хост может продолжать отправлять.

TX во всех ядрах (Libmaple F1, F4 и Generic) имеет тайм -аут, если передача не может быть завершена в пределах X MS, она возвращает. Но поведение тоже зависит от этого. Мне нужно подтвердить, но я считаю, что это как следует:
Libmaple F1 & F4: возвращает количество байтов правильно в очереди для отправки.
Общий F4: возвращает 0, даже если некоторые байты были очередями. Кроме того, у него есть переменная «передачи», которая, поскольку я не могу понять, что именно предназначено для. Я думаю, что намерение состоит в том, чтобы указать, сколько байтов в буфере, ожидающем отправки, но это скорее следует рассчитать с помощью головы и хвоста очереди. Также я не уверен, что переменная передачи получает правильное значение в зависимости от того пути, который берет код. Но это может быть, я не понимаю это правильно, хотя ваше подтверждение того, что TX искажено, и отсутствует байты, я думаю, это подтверждение, которое не работает правильно.

Учитывая, что общее ядро ​​основано в HAL, может быть хорошей идеей заменить код SerialusB на то, что от STM.

Даниэфф
Вторник 15 августа 2017 г. 6:21
Кто -нибудь на самом деле пытался просто подготовить тайм -аут с миллисекундов до секунд?
Замените код serialusb на то, что от STM Serialusb находится поверх всего кода STM.
И код CDC STM не имеет буферизованных записей (CDC_TRANSTIMER_FS () немедленно отправляется, что было первоначальной проблемой), поэтому мне пришлось взломать USBSerial_tx_handler в код CDC STM, поэтому, когда теку Больше вещей, которые нужно отправить и отправлять его из USB -прерывания, вместо serialusbclass :: write (и serialusbclass :: write не отправит его, если он знает, что есть передача Ongoin (переменная передачи)))).

victor_pv
Ср 16 августа 2017 г. 2:07
[Даниэфф - Вторник 15 августа 2017 г. 6:21] - Кто -нибудь на самом деле пытался просто подготовить тайм -аут с миллисекундов до секунд?
Замените код serialusb на то, что от STM Serialusb находится поверх всего кода STM.
И код CDC STM не имеет буферизованных записей (CDC_TRANSTIMER_FS () немедленно отправляется, что было первоначальной проблемой), поэтому мне пришлось взломать USBSerial_tx_handler в код CDC STM, поэтому, когда теку Больше вещей, которые нужно отправить и отправлять его из USB -прерывания, вместо serialusbclass :: write (и serialusbclass :: write не отправит его, если он знает, что есть передача Ongoin (переменная передачи)))).
Разве мы не можем использовать головку и хвост, чтобы определить, есть ли в буфере больше, а не переменную передачи?
Если у нас есть только 1 данные о вытягивании функции (TX_HANDLER) и 1 функция, добавляя данные (serialusb :: write), и мы не позволяем головке ударить хвост, тогда мы всегда можем знать, что сейчас находится в буфере, даже если это мы прерываться и еще много чего.


О коде, я не знал, что это использует STM, так как он показывает Vassilis в качестве автора, я думал, что STM написал свой собственный.

victor_pv
Ср 16 августа 2017 г. 16:46
Все в этой теме, можем ли мы сначала согласиться с тем, каково желаемое поведение для USB TX и RX в случае заполнения буферов?
Мое предпочтение:
Для TX должен вернуться сразу же, и возвратное значение указывает на то, сколько байтов он может стоять в очереди. Если 0 байтов, верните 0. Для x байтов вернуть x. (Итак, это вызывает увольнение тайм -аута, оставьте тайм -аут или повторение для приложения).

Для RX, если буфер заполнен, NAK The Last Host Packet, так что он не отправляет еще один. После того, как в буфере будет достаточно емкости, чтобы получить как минимум на 1 пакет, выпустите ACK для предыдущего пакета, чтобы хост мог отправить новый. Если приложение начинает читать байты из буфера RX в точке, он получает достаточно места для другого пакета, затем выпустите NAK и продолжайте.

Выше, как я изменил код Стива F4 RX для работы (не TX на данный момент).

Даниэфф
Чт 17 августа 2017 г. 7:33 утра
[victor_pv - Ср 16 августа 2017 г., 16:46] - Все в этой теме, можем ли мы сначала согласиться с тем, каково желаемое поведение для USB TX и RX в случае заполнения буферов?
Мое предпочтение:
Для TX должен вернуться сразу же, и возвратное значение указывает на то, сколько байтов он может стоять в очереди. Если 0 байтов, верните 0. Для x байтов вернуть x. (Итак, это вызывает увольнение тайм -аута, оставьте тайм -аут или повторение для приложения).
Возвратные значения в порядке, но там должен быть небольшой тайм -аут. Никто никогда не будет делать повторения с серийным.Печать/написать (...).
[victor_pv - Ср 16 августа 2017 г., 16:46] - Для RX, если буфер заполнен, NAK The Last Host Packet, так что он не отправляет еще один. После того, как в буфере будет достаточно емкости, чтобы получить как минимум на 1 пакет, выпустите ACK для предыдущего пакета, чтобы хост мог отправить новый. Если приложение начинает читать байты из буфера RX в точке, он получает достаточно места для другого пакета, затем выпустите NAK и продолжайте.

Выше, как я изменил код Стива F4 RX для работы (не TX на данный момент).
Вы можете попытаться сделать это, но это глубоко внутри кода CDC STM. (Я думаю. Я на самом деле не проверял)

Что касается данных, наконец, я смог настроить тест, чтобы я действительно мог увидеть проблему. (Используя `for (i = 0; i < TXCHARS; i ++) сериал.Напишите ('0' + (i % 10)); `плюс Teraterm, мне не нужно регистрировать, и я могу видеть 0123456789.)
Кстати, проблема сохраняется, даже если я комментирую тайм -аут, так что не так.

Даниэфф
Чт 17 августа 2017 г., 18:06
Следующий код: // USBSERIAL TX PROBLEM DEMONSTRATION // Pito 7/2017 #include "Arduino.h" void setup() { Serial.begin(115200); delay(3000); } #define TXCHARS 1000000 void loop() { uint32_t i; uint32_t elapsed = micros(); for (i = 0; i < TXCHARS; i++) { Serial.write('0' + (i % 10)); } elapsed = micros() - elapsed; Serial.println("***"); Serial.print("USB TX speed = "); Serial.print((1000.0 * TXCHARS) / elapsed, 2); Serial.println(" KBytes/sec"); delay(5000); }

victor_pv
Чт 17 августа 2017 г., 18:47
Различные приложения могут вытащить пакеты RX с разными скоростями от буфера -хоста, поэтому возможно, что они могут заполняться при использовании Teraterm, а затем код TX будет падать байты, и Arduino IDE может тянуть их быстрее и никогда не допустить. Буфер TX заполняет.
Мы можем добавить немного флага в код TX, чтобы увидеть, заполнится ли когда -нибудь буфер.

При использовании Arduino IDE, вы когда -нибудь видели байтовые последовательности вне порядка? (Вероятно, просто заменить 0123456789 для "" "или" ok "и посмотреть, что у вас осталось)

Даниэфф
Пт 18 августа 2017 г. 5:09
Это не о буфере TX. Следующий код обходит весь класс serialusb, без сериала.xxx звонок вообще: #include "Arduino.h" char buffer[200]; #define TX 1000 void setup() { Serial.begin(115200); delay(3000); memset(buffer, '.', sizeof(buffer)); for(int i=0; iTxState != 0); // Wait for USB transfer to finish } delay(5000); }

Стивестронг
Пт 18 августа 2017 г., 7:00 утра
Я также согласен, что никто никогда не попытается повторно отправить данные при выходе через серийный.
То есть я думаю, что отправка сериала должна быть как можно простая, поэтому либо блокировать, либо не блокировать.

Последовательный USB F4 был первоначально настроен на неблокирование, но я изменил это, потому что я пропустил некоторые данные со стороны хоста. После смены этого приема на стороне хоста было в порядке.

Чип должен отправлять данные как можно быстрее.
Кроме того, хост должен прочитать эти данные как можно быстрее. Неспособность сделать это, конечно, будет результатом потери данных.
Если хотя бы одно приложение для хоста способно читать все данные, это означает, что чип работает нормально.

Похоже, у Teraterm есть проблемы с Win10?

Пито
Пт 18 августа 2017 г., 18:22
Commecho тоже теряет данные (см. Выше из моего win7_64bit).
Не могли бы вы примерить свои машины - Commecho - вернет ли он 1 мил chars ok, plz?

Обновлять:
С последним Libmaple F1 я получаю 1 мили ChARS от Teraterm при входе в файл (217 кб/с, когда не зарегистрирован, 102KB/S при регистрации в файл).
С последним Libmaple F4 я получаю 1 мили ChARS от Teraterm при входе в файл (170 КБ/с, когда не зарегистрирован, 102KB/S при регистрации в файл).

victor_pv
Пт 18 августа 2017 г. 8:50 вечера
Проблема с блокировкой TX заключается в том, что в последовательном порте, если в другом конце нет ничего, есть конечная сумма, которую потребуется для отправки данных и установленного уровня бода, а затем вернется, так что не будет Блок постоянно.
Но в USB, если другой конец не получает его. Так больше или меньше, но я думаю, что необходимо некоторое время ожидания. Мы могли бы установить тайм -аут как множество времени на байт для определенной минимальной скорости, поэтому время ожидания не одинаково при отправке 1 байт, как при отправке 1000. Это будет больше напоминать, что будет делать драйвер UART.

С другой стороны, с тайм -аутом, если хост медленно получает данные, мы можем потерять байты. Но я думаю, что любой, кто не хочет потерять байты, должен проверить возвращенное значение, чтобы подтвердить, что оно было отправлено. Если это не критично, игнорируют возврат.
Например, если мы решим использовать тайм -аут для имитации минимальной скорости 100 КБ/с, то это будет 10us за байт. Если хост медленнее, чем этот (или отключен), то трансмиссии могут тайм -аут, но если хост сохраняет хотя.

Но на RX, если мы не перестанем отправлять Acks на хост, пока не появится места в буфере, очень возможно, что данные будут потеряны, не имеет значения, что делает приложение, поскольку хост потенциально намного быстрее.
Ядро F1 делает это, и в Libmaple F4 я изменяю его локально, я отправлю PR, чтобы больше людей могли проверить, что RX.

На общем TX я постараюсь повторить некоторые тесты, которые проделал Пито, и посмотреть, есть ли какая -то разница, но я не убежден, что это просто терратерм.

Пито
Пт 18 августа 2017 г. 22:01
http: // www.за пределами сложности.org/usbnutshell/usb1.SHTML
Ведущий отвечает за управление полосой пропускной способности автобуса. Это делается при перечислении при настройке изохронных и прерывающих конечных точек и на протяжении всей работы шины.

victor_pv
Пт 18 августа 2017 г. 22:44
Да, но продолжайте читать:
http: // www.за пределами сложности.org/usbnutshell/ ... Сохронный
OUT: Когда хост хочет отправить функцию массовым пакетом данных, он выдает токен Out, за которым следует пакет данных, содержащий объемные данные. Если какая -либо часть токена или пакета данных повреждена, то функция игнорирует пакет. Если буфер конечной точки функции был пуст, и он включил данные в буфер конечной точки, он выпустит ACK, информируя об хосте, который он успешно получил данные. Если буфер конечной точки не пуст из -за обработки предыдущего пакета, то функция возвращает NAK. Однако, если у конечной точки была ошибка, и ее бит остановки был установлен, она возвращает стойло. Также я думаю, что важно отметить: Объемные переводы
Используется для передачи больших взрывающих данных.
Обнаружение ошибок через CRC, с гарантией доставки.
Нет гарантии пропускной способности или минимальной задержки.
Потоковая труба - однонаправленная
Полный & Только режимы высокой скорости.
Мы должны гарантировать доставку с помощью рукопожатия, но нет никакой гарантии пропускной способности, поэтому мы не должны сбрасывать пакеты только потому, что приложение на хосте или MCU не так быстро.

Пито
Пт 18 августа 2017 г. 11:18
Мое наивное «Пользовательское» наблюдение (на основе вышеуказанных результатов с Libmaple F1 и F4) следующее:

USB TX в Libmaple «понял команды (хост -хост) Teraterm (хост), так как он перенес 1 мил ok с 102 кб/с как для F1, так и для F4, в то время как TT вошел в данные в файл.

Очевидно, что TX Libmaple был организован хостом, так как общая достигнутая скорость TX одинакова для F1 и F4 (скорость пакета такая же, потому что USB -часы одинаковы, но накладные F4/F1 сделала бы Разница в общей скорости TX, когда пакеты не были синхронизированы хостом).

С помощью TX Daniel мы можем достичь более высоких скоростей NX (с большими размерами буферов CDC), но мы теряем, скажем, 70% данных - таким образом, кажется, что STM32Generic TX игнорирует команды рукопожатия TT ​​-хоста..

Серийный монитор Arduino, возможно, намного быстрее, чем TT, поэтому он захватывает 1 мил ChARS без надлежащего поручения, или он использует другую модель ручной работы, STM32GENERIERENEREN TX понимает лучше..

Rogerclark
Сб 19 августа 2017 г. 1:09
У Libmaple есть код, который проверяет один из сигналов рукоятки (я думаю, DTR), и если он не может отправить данные на хост, то код «блоки» в функции write ()

Было отмечено, что это отличается от того, что, похоже, не проверяет, готов ли хост для данных

victor_pv
Сб 19 августа 2017 г. 1:09
@Pito, я в значительной степени согласен с вами в этой теории.

victor_pv
Сб 19 августа 2017 г. 1:18
[Rogerclark - Сб 19 августа 2017 г. 1:09] - У Libmaple есть код, который проверяет один из сигналов рукоятки (я думаю, DTR), и если он не может отправить данные на хост, то код «блоки» в функции write ()

Было отмечено, что это отличается от того, что, похоже, не проверяет, готов ли хост для данных
Роджер, я много посмотрел на код F1 при написании Readbytes, чтобы попытаться достичь максимальной скорости. Libmaple F1 будет работать с хозяином с ACK и NACK в TX и RX, поэтому, когда буфер на одной стороне будет заполнен, другая сторона будет удерживать дальнейшие пакеты. Когда буфер получает место, ACK отправляется на другой конец, и продолжает передачу, пока буфер не заполнится, и этот конец снова не отправит Нэк.
Что касается того, что я видел с DTR, используется только для обнаружения сброса волшебного слова, но для обычного рукопожатия, но ручная задача с ACK и NACK - это то, что должно произойти, и, кажется, является хорошей реализацией.

У F4 в RX этого не было. Он всегда отправлял ACK, даже если буфер был заполнен. Я изменил это и сейчас работает довольно хорошо. Я могу получить 500 КБ/с, аналогично F1 (MCU быстрее, но код основан на SPL, более накладных расходов, чем Libmaple).
F4 TX действительно работал в моих тестах, и я не внес никаких изменений в это.

У меня не было возможности копать глубоко в той, что используется общим ядром, чтобы увидеть, что именно это делает, но я подозреваю, что рукопожатие не так, как подозревает Пито.

Лично я думаю, что реализация, которая теряет байты в любом направлении, просто бессмысленная. Если я захочу отправить что -то в одну сторону, потому что я хочу получить это в другом конце.
Я понимаю, что для распыления последовательных отчетов здесь и там не иметь большого значения, но для передачи изображений, таблиц, данных датчиков, что -либо еще отправлено, я бы не хотел терять ни одного байта, если ссылка не упадет или один конец не Отвечая слишком долго.
Я бы предпочел иметь без потерь 100 КБ/с, которые 500 КБ с проигрышами.

vitor_boss
Сб 19 августа 2017 г., 4:26 утра
Я не программист, просто любопытный, это то, что я мог найти: ... CDC_Transmit_FS(&tx_buffer.buffer[tx_buffer.iTail], transmitting); //Set buffer and begin tranmission ...

Даниэфф
Сб 19 августа 2017 г., 6:05
Libmaple Lasting от Repo, Maple Mini, Log Teraterm, тестовый код из первого сообщения (GCC 6-2017-Q1-Update), USB, по-видимому, отбрасывает данные (все *** должны быть на одном столбце):
teraterm3.png
Teraterm3.PNG (48.29 киб) просмотрено 664 раза

Пито
Сб 19 августа 2017 г., 7:12
Хм, то, что я сделал сегодня утром - Установлен Wireshark - бесплатный открытый сетевой анализатор, который включает в себя анализатор "USB Packet Capture".

https: // www.Wireshark.орг/

Тестирование с помощью цикла отправляет «u» (0x55) Teraterm (Win7_64b), от Black F407:

Libmaple F4 - пакеты данных, идентифицированные как «5555» и Ethernet II - «« Уродственный пакет », всегда протокол пакета данных« 5555 »с некоторыми данными заголовков, а затем содержащим 2048x« U »и небольшой тип протокола Ethernet». «28 Urb -объем в уродливых», содержащий 1x u, между ними, не видно рукопожатия (если не уродство не является пакетом рукопожатия)

32GENERIERC - пакеты данных, идентифицированные как 5555 или «Ethernet II», один пакет, содержащий 16-100 "U" S, не видно рукопожатия

В качестве доказательства это как -то работает, я пробовал для развлечения:
Я сохранил файл с UUUS в Corsair Flash Drive и прочитал его в редактор.
Это другое устройство (массовое хранилище), но - все пакеты данных, назначенные «хорошими», до 65535 больших, с рукопожатием (2 <-> Транзакции между Host A Device) между пакетами данных. Протоколы пакетов были связаны с USB.

Libmaple:
Libmaple USB Capture.jpg
Libmaple USB захват.JPG (194.53 киб) просмотрено 649 раз

Стивестронг
Сб 19 августа 2017 г., 7:57 утра
Пито, очень интересный.
Libmaple F4 USB CDC основан на SPL на основе SPL.
Не могли бы вы проверить Libmaple F1?

Пито
Сб 19 августа 2017 г. 8:05 утра
Libmaple F1 - Похоже на 32 GENEREN, но гораздо больше UUS внутри пакета:
Libmaple f1 capture.jpg
Libmaple F1 захват.JPG (227.8 киб) просмотрено 371 раз

Пито
Сб 19 августа 2017 г. 10:15 утра
Libmaple F1 против гипертерминализации (227 КБ/с)
Libmaple F1 против Hyperterminal.jpg
Libmaple F1 против гиперподронала.JPG (245.55 киб) просмотрено 350 раз

ZMEMW16
Сб 19 августа 2017 12:04
Если последний пакет не заполнен, может быть, попробуйте это ?
Интересно, что отправка пакетов все на 1 байт ниже максимального размера что -то изменит ?
SRP

Пито
Сб 19 августа 2017 12:38
К вашему сведению: загрузить через DFU (Maple_Loader v0.1, хост, от Словера) в Maplemini (разработчик 2.39.0) - Пакеты полезной нагрузки (1052bytes) с некоторым рукопожатием (только небольшая часть показанных данных, до конца нет аномалий, все чистые, только 2 необработанных пакета из ~ 60 во время фазы переключения/init):
Maplemini dfu bin upload.jpg
Maplemini dfu bin загрузка.JPG (240.49 киб) просмотрено 328 раз

victor_pv
Сб 19 августа 2017 г. 14:59
Ребята, со всеми ядрами в настоящее время есть тайм -аут TX, если хост не тянет пакеты так быстро, как MCU может отправить их.

Это одна из причин, по которой я изменил эскиз для тестирования PITO, чтобы отправить блоки, а не 1 байт, поэтому я делал большие транзакции, а не многие очень маленькие.

Я думаю, что для тестирования мы могли бы прокомментировать тайм -аут проверки на TX, поэтому мы знаем, что это не фактор, влияющий на какое -либо падение пакета.

РЕДАКТИРОВАТЬ:
Я также подтвердил, что общий код RX будет сбрасывать байты, если эскиз не будет читать их как та же скорость, что и хост отправляет. Он признает каждый пакет обратно к хосту, несмотря ни на что.

Легкий тест:
Откройте порт сериалом.начинать();
Тогда Loop никогда не читая из порта.
Затем отправьте от хоста в хост, хост никогда не будет блокировать, потому что MCU подтвердит все пакеты, даже если не читать их.

Вы также можете проверить, открыв порт с серийным.начинать().
Затем задерживайте достаточно долгое время.
Затем распечатайте то, что читается.
Затем с хоста отправьте все больше, чем общий размер буфера. Хозяин будет вести себя так, как будто все было отправлено, но MCU будет печатать только то, что подходит в размере буфера. Все остальное после этого было сброшено без знания хозяина.

Если вы пытаетесь отправить что -то большое, например, изображение, как можно быстрее, вполне вероятно, что вы потеряете данные, если вы наброски можете обработать его быстрее, чем хост может отправить.

С моей точки зрения это нежелательно, поскольку на хосте скорость последовательного порта не влияет на то, как быстро приложение будет пытаться отправить данные, либо вы реализуете некоторые изделия в свои приложения (в MCU и на компьютере), либо или или Вы никогда не знаете, когда буфер может быть заполнен и сбрасывает данные.

Edit2:
Я изменил код, чтобы вести себя как Libmaple F1, в котором, если буфер заполнен, он не подтвердит пакеты обратно на хост. Это в этой ветви. Синхронизируется с Даниэлем, кроме этих изменений.
https: // github.com/Victorpv/stm32generi ... имизации

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

Пито
Сб 19 августа 2017 г., 18:32
TX: Что если сериал.Напишите (и друзья) проверят, не является ли хост, и это таймауты при возвращении 0 ??

victor_pv
Сб 19 августа 2017 г., 19:20
[Пито - Сб 19 августа 2017 г. 18:32] - TX: Что если сериал.Напишите (и друзья) проверят, не является ли хост, и это таймауты при возвращении 0 ??
Вы имеете в виду без буферизации, даже если в буфере есть емкость?

Таким образом, код TX в настоящее время должен ждать NAK, прежде чем получить больше данных из буфера TX и отправить его. И функция write (), как она записывает в буфер, а не USB Peripheral, вернется 0, если буфер будет заполнен, но не до этого момента.
Работает ли этот IR правильно, или период времени ожидания достаточно длинный, это готово для дебатов.
Я бы предпочел тайм -аут, который пропорционален тому, что приложение пытается отправить. Не то же самое ожидание буферного пространства на 1 байт, чем для 30 или 300.

Пито
Солнце 20 августа 2017 г. 10:47
С точки зрения пользователя я не вижу каких -либо буферов (внутренних в ядре STM или в хосте), и мне не волнует, какие буферы находятся внутри черного ящика (ES) ».

У меня есть хост, который может быть не в состоянии быстро (по любой причине).
Я делаю сериал.Что -то (1byte или 1kb или 1 МБ) из моего эскиза.

Когда сериал.что -то возвращает 0 или возвращает число, которое меньше, чем сумма, которую пользователь намеревался отправить, это означает, что для пользователя данные не были «получены» хостом (другая сторона не приняла их все или приняли только только часть этого).
Я - пользователь - мне нужно заботиться на уровне своего эскиза, что должно произойти в такой ситуации.
Таким образом, вы не можете потерять какие -либо данные TXED.

Представьте, что вы собираетесь загрузить изображение из вашего массива 100 КБ (массив в вашем эскизе, user_array) через USB -сериал на хост ПК. Он должен работать так, когда хост компьютера сможет получать, скажем, 1 кб в минуту через USB, вы загрузите этот user_array за 100 минут успешно на хост без каких -либо потерянных данных..

victor_pv
Sun 20 августа 2017 г. 16:21
Но тогда у вас есть другие люди, думающие по -другому:
ViewTopic.PHP?F = 51&t = 2354&начало = 30#p33133

Как я это вижу, у нас есть два варианта:
1.- Гарантированная доставка с блокировкой.
2.- Не гарантированная доставка, после определенного тайм -аута не отправляет и не возвращает количество байтов, которые были успешно отправлены (или буферизации)

Но, похоже, мы не можем остановиться на одном из других.
Мой Opcion 2, и приложение проверить возвратное значение. Это будет напоминать то, что происходит с физическим USART. Код не будет блокировать и просто выводить данные по данной ставке.

Кроме того, в качестве более продвинутой функции мы могли бы использовать параметр бод, который мы в настоящее время игнорируем, чтобы управлять тайм -аутом.
Так что, если мы сделаем сериал.Начните (115200), тогда тайм -аут должен составлять около 70us за байт.
Таким образом, если у вас есть медленное приложение, в которое вам нужно отправлять не более быстрее, чем на 57 кбит / с, вы можете установить на это скорость передачи данных, и функция записи USB будет блокировать только для этого скорости и вернуться с номером байтов фактически отправлены, если это займет больше времени, чем это.

Martinayotte
Sun 20 августа 2017 г. 16:54
Seemy Post здесь: ViewTopic.PHP?f = 3&P = 33241#P33241

Пито
Пн 21 августа 2017 г. 9:43
Сериал.Исторически что-то происходит из серийного коммуникации UART, подобного RS232, где рукопожатие с хозяином управляется RTS/CTS, DTR/DSR и т. Д., или через xon/xoff, или сделано на уровне приложения через Xyzmodem/Kermit и т. Д.
Без такого рукоятки это может прийти к потере данных с RX/TX. Но это рукопожатие обычно не используется с Duinos. Так серийный.что -то может потерять данные, когда внутренние кольцевые бакаферы заполняют или медленно читают их, или что -то в этом роде.

Serialusb использует сложный USB -протокол, который по своей природе включает в себя рукоятки. Итак, на уровне рук на «пакетах» есть уровень. Это необходимо использовать, а затем вы не можете «потерять» какую -либо информацию, пока RX/TX.
Люди могут обсудить, что должно произойти, когда мы используем USB -слой для «серийной» эмуляции - будем ли мы распространять RT/CTS или такие типы сигналов и т. Д. То, что я видел в различных дискуссиях по этой теме - даже они говорят, что USB CDC включает в себя такого рода флаги (команда out 0x22 (set_control_line_state) rts/dtr bits в cdc_acm) - это не обязательно с USB, как вы можете сказать другим сторона «Перестань посылать, я не могу читать новый пакет».

К вашему сведению: аналогичное обсуждение на форуме Pauls - .Sketch и Python Script для тестирования и мониторинга сериала CDC..
https: // форум.PJRC.com/threads/33167-us ... -обнаружение
Может, мы сможем как -то повторно использовать это.

О накинге в/из USB -пакетов:
http: // nuttx.org/doku.PHP?id = wiki: nxint ... SBOUT-NAK

Пито
Пн 21 августа 2017 г., 18:24
К вашему сведению - вот как «Usblyzer» (не бесплатно, 33D Eval) показывает передачу между Mmini и Teraterm (Libmaple F1).
Usblyzer предоставляет огромное количество информации, поэтому мне пришлось отрезать только небольшую часть, которая подходит как привязанность.
Вы можете увидеть полезную нагрузку UUUU Данные фрагментированы на 1-16/414-426Bytes большие куски. Не знаю, что означает "4096 Buffer".
Транзакции отмечены успешными.
Usblyzer 3.jpg
Usblyzer 3.JPG (136.28 киб) просмотрено 563 раза

Рик Кимбалл
Пн 21 августа 2017 г., 19:15
@Pito, вы пробовали это с "замазкой" вместо Teraterm?

victor_pv
Вторник 22 августа 2017 5:19
Pito Драйвер Windows определенно делает буферизацию на своем конце, так как объемный перевод только для 64 -битов, жестко кодируется в драйвере Libmaple.
Интересно, что 4096 - это некоторая информация, которую хост отправляет на доску, чтобы указать, сколько буферных пространств у него в настоящее время имеет.

Пито
Вторник 22 августа 2017 г. 9:08
@Rick: я попробовал с гиперподроналом (тот же результат - см. Выше) и с Minicom (Ubuntu в VirtualBox). С Minicom я не сделал никаких захватов.

@VICTOR: «Буфер 4096B» может быть некоторым неверным истолкованием данных USBLYZER или рукопожатие..
Обновление: кажется USBSER.SYS запросы 4 КБ объем в..

Сек. Числа всегда обращаются к пакетам, например, 128-127, где 127 был пакетом «4096B Buffer», чтобы это мог быть 128-й пакет, отвеченный на 127-й..

Что интересно, так это результат - размеры кусков полезной нагрузки - похожи на то, что я получил от Wireshark.
Он отправляет ~ 1 мс (период пакета) ~ 16 или ~ 420bytes ("случайный размер"). Это то, что нужно понять.

При выполнении серийного.Напишите ('u') в цикле, который вы заполняете в буферах быстро, поэтому я ожидаю, что исходящие пакеты полезной нагрузки всегда будут содержать количество Uuus, равное размеру самого низкого уровня слоя.

Обновление: Mmini Libmaple против Putty (Win7_64b) - те же результаты, что и выше, с Wireshark и Usblyzer.
Putty.jpg
Замазка.JPG (226.03 киб) просмотрено 525 раз

Пито
Вторник 22 августа 2017 13:19
Это с Mmini, Libmaple F1, с этим модом vitor_boss из моего эскиза (сериал.написать (buf..): void loop() { uint32_t i; uint8_t x = 85; uint32_t elapsed = micros(); uint8_t buf[bufsize]; for (i = 0; i < bufsize; i++) { buf[i] = x; } elapsed = micros(); for (i = 0; i < TXCHARS; i+=bufsize) { Serial.write(buf, bufsize); } elapsed = micros() - elapsed;

Пито
Вторник 22 августа 2017 13:52
Проблема: STM32GERIERIER с CDC_BUF 128 и BUFSIZE = 256 (скорость ???)
3 секунды между пакетами
STM32Generic CDC_BUFF 128 BUFSIZE 256.JPG
STM32Generic CDC_BUFF 128 BUFSIZE 256.JPG (134.05 киб) просмотрено 488 раз

victor_pv
Вторник 22 августа 2017 г. 14:28
Почему вы отметили это как проблему? Проблема: STM32GERIERIER с CDC_BUF 128 и BUFSIZE = 256 (скорость ???)
3 секунды между пакетами

Пито
Вторник 22 августа 2017 г. 16:48
Из -за 3 секунды между пакетами, когда Bufsize в эскизе составляет 256 баллов (или 512, 1024 и т. Д.)..
Это даже видно в TT, поскольку куски 4 КБ всегда вздремните 3 секунды..

Другой тест - подсчет байтов - вошел в файл TT.
Чтобы сделать это просто, я txed 1.280.000 байтов #define bufsize 64 #define TXCHARS bufsize*20000

Даниэфф
Ср 23 августа 2017 г. 16:39
[Пито - Вторник 22 августа 2017 г. 16:48] - Libmaple F1, Bufsize 64 в эскизе, зарегистрировано 1.280.000 байтов -> ХОРОШО.
Моя проблема в том, что я делать Получите потери с помощью Libmaple Maple Mini Teraterm (4.95 (SVN# 6761) 31 мая 2017 г. 20:25:51) (Win10, USBSER.Sys 10.0.14393.0). Данные, полученные в файле журнала с 1272912 до 1279552.

Изменить: если я запускаю другую интенсивную программу процессора одновременно (https: // www.Мерсенн.орг/скачать/), проблема исчезает, и я получаю все данные из приведенного выше теста.

Пито
Че 24 августа 2017 г., 19:06
@Daniel: Интересно! Моя гипотеза: под управлением вышеуказанного теста (стресс -тест на процессор Mersenne) вы нагреваете внутреннюю температуру в своей коробке, такая ваша USB -подсистема работает лучше (то есть USB -часы??, напряжения??).

Даниэфф
Пт 25 августа 2017 г. 5:11
Используя этот код https: // Stackoverflow.com/a/6037377/834966, с большим `buffer [1024]`
* Оригинальный плотный цикл: все полученные данные
* `Sleep (10/100/1000)` В цикле: потеря того же Amout (!) данных. (Тайм -аут TX в коде Arduino прокомментируется, блокируя весь путь!)

Код из первого сообщения на 3 Tennsy 3.5 в Teraterm: потеря некоторых данных.

Я начинаю подозревать, что это USBSER.система. Есть ли альтернативные драйверы? Мне нужно будет запустить живой компакт -диск Linux на этой машине.

(Я также получаю проблему 128/256 буфера 3 секунды, но это будет что -то еще полностью.)

Пито
Пт 25 августа 2017 г., 6:43
В дискуссии я видел, что они рекомендуют Winusb вместо USBSER.система..