Я использую STM32F4 (голое железо с библиотекой HAL) в качестве HTTP-сервера. Я не реализую уровень TCP, потому что это делает для меня модуль WiFi232 D2 — все, что я получаю в uC через UART, — это строка с чистым HTML-запросом (и все, что я отправляю, — это строка с чистым HTML-ответом). Требованием приложения является отправка одного большого ответа с веб-страницей SPA (почти 300 тыс. символов) и нескольких крошечных ответов в виде AJAX (~ 200 символов). С 57600bps все работает нормально, но для загрузки большого отклика на клиенте требуется 50 секунд, поэтому, очевидно, мне нужно увеличить скорость передачи данных.
Это было введение в декорации, теперь основная игра, где начинается проблема: со всем, что выше 57600 бит/с, я теряю символы сообщений по пути в браузер. Я теряю их случайным образом — обычно это ряд смежных символов; иногда несколько, иногда более сотни из них. Первоначально я играл с блокировкой приема UART. Когда я заметил проблему, я перешел на DMA, и это не дало абсолютно никаких изменений. Я протестировал оба случая отправки через UART на терминал FTDA -> USB -> Termite вместо модуля WiFi и увидел те же симптомы. Поскольку каждая отдельная симуляция приводила к потере данных, я дошел до того, что даже скрестил STM Tx с Rx и проверил, все ли работает нормально на самой короткой из возможных цепей, и... это, конечно, сработало отлично :) Итак, UC исключается из числа подозреваемых.
Так возможно ли добиться надежной передачи UART? Есть ли у вас какие-либо идеи о том, как отправлять HTTP-сообщения по UART с высокой скоростью передачи данных? Я чувствую, что исчерпал все возможности, но маловероятно, что 115 кбит/с - это слишком много, не говоря уже о Мбит/с... Может быть, я упускаю что-то простое? Применение аппаратного управления потоком лишь немного исправляет передачу, я все еще получаю ошибки на 115 кбит/с (хотя и реже, чем без него).
*Обратите внимание, что я продолжаю говорить о HTTP-сообщениях из-за их особой природы - я не могу реализовать ни кадрирование, ни программный алгоритм управления потоком, потому что у меня нет власти на стороне браузера в этой коммуникационной цепочке.
РЕДАКТИРОВАТЬ: Еще несколько наблюдений:
В соответствии с этими наблюдениями я предпочитаю не использовать hwfc, а просто добавлять некоторую задержку в известных местах (после каждого 8191-го или 4095-го символа, в зависимости от скорости передачи). Однако это очень хакерски , я ненавижу это решение и надеюсь, что есть лучший способ решить эту проблему.
Звучит как проблема управления потоком для меня. Модуль Wi-Fi требует этого при более высоких скоростях передачи данных, потому что он не может отправлять пакеты на полной скорости - внутренние буферы заполнены. Если ваш MCU поддерживает это, вы должны использовать UART с аппаратными сигналами управления потоком (обычно называемыми RTS и CTS).
huart3.Init.HwFlowCtl = UART_HWCONTROL_RTS_CTS
, я проверяю флаги TC и TXE перед каждым началом передачи, я всегда жду в цикле HAL_BUSY
, когда я не получаю никаких ошибок во время передачи, и принимающий модуль должен работать даже с 460800... Что-то еще надо сделать?
Адам
кл.
Арсенал
жалук