Изменить на USB -сериал, чтобы не потребовать, чтобы DTR установил хостом

Rogerclark
Солнце 16 июля 2017 г. 1:41
Кажется, что наша серийная функциональность USB отличается от нормального E.G AVR и SAM Функциональность в том смысле, что мы не отправляем данные, если не установлен DTR USB Connection DTR

Я внес изменения в это в филиале Zumspot, чтобы поддержать сообщество Radio Ham, где он не проверяет DTR

Видеть

https: // github.com/rogerclarkmelbourne/ ... Re/Zumspot


Если наша функциональность отличается от нормы, возможно, я должен объединить это изменение в главную ветвь

Редактировать.

Я проверил это, в том числе оставить открытое окно терминала Arduino, и я не вижу никаких негативных последствий изменения IS.

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

Rogerclark
Солнце 16 июля 2017 г., 4:04
На самом деле, кажется, есть побочный эффект этого изменения

Если я закрою окно терминала и подожду некоторое время, эскиз, похоже, останавливается, ожидая, пока USB отправит данные на ПК (как и несколько серийных.Lines Println () в графическом тесте)

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

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

Стивестронг
Солнце 16 июля 2017 г. 8:02 утра
[Rogerclark - Солнце 16 июля 2017 г., 4:04] - Если я закрою окно терминала и подожду некоторое время, эскиз, похоже, останавливается, ожидая, пока USB отправит данные на ПК (как и несколько серийных.Lines Println () в графическом тесте)
Та же проблема в настоящее время для F4 тоже: https: // github.com/rogerclarkmelbourne/ ... Проблемы/306
Проблема в том, что я не знаю горячий, чтобы исправить это, потому что в новой USB Lib (SPL от ST) нет функции "usb_is_connected ()"

Rogerclark
Солнце 16 июля 2017 г. 10:23
У F1 есть эта проблема, только если я удалю чек на DTR

Я посмотрел на то, почему это может происходить, и это похоже на его, потому что буфер TX заполняется и возвращает ноль

https: // github.com/rogerclarkmelbourne/ ... ACM.C#L428

Так что он остается в этом, пока петля

https: // github.com/rogerclarkmelbourne/ ... #L127-L129

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

Мы, вероятно, можем сделать это, мой модификация кольцевых буферов в USB_CDCACM.в

Стивестронг
Солнце 17 июня 2018 г., 17:48
[Rogerclark - Солнце 16 июля 2017 г. 10:23] - Я не знаю, что лучшее для этого. Я предполагаю, что лучший способ справиться с этим - для удаления самого старого элемента в буфере, и просто сохранить самый новый, готовый к тому, что USB -хост будет готов к данным.
Как это решается для досок AVR и SAM?

Ахулл
Солнце 17 июня 2018 г., 21:50
Вместо того, чтобы просто удалить это, можем ли мы сделать изменение настраиваемым, могут быть времена, когда вы хотите, чтобы эскиз ждал хоста, а не просто сбросить или пропустить данные. Если настраивать, то, я думаю, поведение по умолчанию должно соответствовать «стандартному» поведению Arduino.

Zoomx
Пн 18 июня 2018 г. 8:10
Поскольку в моих соединениях я никогда не использовал управление потоком, и это работает, я считаю, что DTR используется драйвером.

Arduino IDE использует DTR для сброса UNO при открытии серийного монитора. Я не знаю, то же самое с Леонардо, из -за наших досок STM32 и всех других досок, у которых есть родные USB.
Насколько я знаю, DTR никогда не используется во время связи, многие терминальные программы показывают состояния серийной линии, но я могу ошибаться, так как я никогда не исследовал это, я просто предполагал, что DRT никогда не используется.

Если возможно, IMO лучше иметь этот настраиваемый.

Сжимать
Пн 18 июня 2018 г., 17:06
DTR - это остаток из Arduino World, чтобы генерировать сброс импульс для функции «AutoReset». Я почти уверен, что нам не нужно играть с DTR в серийной реализации USB.

Zoomx
Пн 18 июня 2018 г., 18:30
[Сжимать - Пн 18 июня 2018 г., 17:06] - DTR - это остаток из Arduino World, чтобы генерировать сброс импульс для функции «AutoReset».
Только в Arduino с семейством Atmega328, Леонардо и Due (USB Native Poards) Используйте другой метод с использованием 1200 бодского соединения.

Вассилис
Пн 18 июня 2018 г., 18:33
[Zoomx - Пн 18 июня 2018 г. 8:10] - Поскольку в моих соединениях я никогда не использовал управление потоком, и это работает, я считаю, что DTR используется драйвером.

Arduino IDE использует DTR для сброса UNO при открытии серийного монитора. Я не знаю, то же самое с Леонардо, из -за наших досок STM32 и всех других досок, у которых есть родные USB.
Насколько я знаю, DTR никогда не используется во время связи, многие терминальные программы показывают состояния серийной линии, но я могу ошибаться, так как я никогда не исследовал это, я просто предполагал, что DRT никогда не используется.

Если возможно, IMO лучше иметь этот настраиваемый.
Ардуино Леонардо только открывает последовательное соединение со скоростью 1200 бит / с, а после этого он закрывает соединение. Это происходит перезагрузка в MCU и помещается в режим загрузчика.

DTR необходим в случае использования «1EAF» перезагрузить магическую последовательность. Без DTR нужно искать входящие данные, чтобы увидеть, содержит ли он магическую последовательность 1EAF.
В случае DTR данные непрофессионалов будут выполнены только после того, как сигнал DTR InfoMming.

Азарубкин
Пт 24 августа 2018 г. 14:03
ОК, тогда низкое состояние DTR используется в качестве флага для изучения входящих данных; Но почему мы не можем отправить, пока DTR низкий?

Я думаю, что могу изменить USB_CDCACM_TX Функция перезаписать самые старые данные в кольцевом буфере TX. Если вы можете придумать ситуацию, когда она может привести к потере данных, я могу сделать новое поведение настраиваемым, причем старое поведение - по умолчанию.

Или, как другой предлог, я могу изменить size_t usbeserial :: write (const uint8 *buf, uint32 len). В настоящее время он всегда возвращает 0, если я не ошибаюсь (https: // github.com/rogerclarkmelbourne/ ... л.CPP#L119) потому что не переменная никогда не изменяется. Давайте сделаем эту функцию вернуть фактическое количество написанных байтов и позволим пользователю повторить передачу позже, если он хочет. Кроме того, настраиваемое время -аут TX может быть добавлен в эту функцию, чтобы она не застряла в цикле вечно.

Тогда мы можем удалить чек на DTR из Usbeserial :: operator bool ().

Как другая мысль, Википедия говорит это Во многих операционных системах, включая Windows, линия DTR удерживается низкой, в то время как последовательный порт не используется и не контролируется какими -либо приложениями. Затем мы можем сделать эту проверку для настраиваемой DTR - если DTR низкий, то порт, вероятно, закрыт, но если пользователь все еще хочет что -то отправить, он может. Я, например, нуждался в отправке, в то время как DTR низкий, потому что я использовал STM32 в качестве моста USB-сериала для чипа ESP32, а его загрузчик накладывает DTR, и ему требуется двунаправленный обмен данными.