Вопрос или проблема
Я пытаюсь отправить файлы на Raspberry Pi Compute Module 3+ с компьютера под Windows 10, используя мост UART-WiFi; Raspberry Pi подключен к стороне UART, ПК подключается к мосту через WiFi. Мост — это единственный возможный способ интерфейса с Raspberry Pi без серьезных изменений в проекте. Я успешно передал небольшие файлы (~3-5 кБ), как текстовые, так и бинарные, используя функцию ZMODEM в TeraTerm, но если я пытаюсь отправить что-то большее, даже порядка десятков килобайт, передача ZMODEM застревает, и в итоге я получаю либо “файл xyz удален”, мусорный файл или ничего.
С файлом размером 13 кБ индикатор выполнения достигает 100%, и количество переданных байтов кажется правильным, но он все равно не удается, тогда как для значительно больших файлов в диапазоне мегабайт индикатор выполнения достигает определенного значения, потом зависает/мерцает. Это значение кажется постоянным для одного файла, т.е. каждый раз, когда я пытаюсь отправить файл, он достигает одной и той же цифры, но значительно различается между файлами.
Крупные файлы, которые я пытался отправить, были случайными Excel-таблицами и .stl файлами, если это имеет значение. Есть идеи, в чем может быть проблема? Я подозревал плохое соединение, но после обновления антенны на мосте UART-WiFi (ESP8266) индикатор выполнения все равно достигал того же значения, прежде чем зависнуть. Я могу подозревать, что какой-то специальный символ мешает работе, но я бы подумал, что ZMODEM устойчив к этому. Определенно достаточно места для всех файлов, так как я недавно удалил огромный файл видеопотока размером 33 ГБ.
Я видел подобные проблемы раньше. Возможно, ваш мост или драйверы на стороне ПК неправильно настроены или не способны учитывать управление потоком от вашего UART устройства. Ваше программное обеспечение моста может позволить настроить имитацию аппаратного управления потоком, если вам повезет.
Некоторые старые программы передачи *Modem позволяли вам контролировать размер пакета и/или устанавливать задержку между пакетами. Они также позволяли включать/отключать управление потоком на уровне проводов и настраивать несколько других параметров управления, таких как добавление задержки между символами.
Серийные мосты на X часто путаются, когда устройство на серийной стороне вызывает аппаратное управление потоком, что может происходить, когда устройство нужно записать блок данных в другое устройство и требуется на время предотвратить прерывания серии.
Прошло несколько десятилетий с тех пор, как я последний раз работал с ZModem, но я думаю, вы можете настроить сторону ПК, чтобы ввести задержку между пакетами, и настроить сторону Raspberry Pi так, чтобы не использовать аппаратное управление потоком. Я, кажется, вспоминаю, что также можно настроить размер скользящего окна, но могу путать это с одной из других программ *Modem.
Вам придется прочитать документацию и поэкспериментировать. Имейте в виду, что ZModem имеет ограничение на размер файла в 4 ГиБ, из-за использования 32-битных смещений файла, когда приемник запрашивает потерянные пакеты. Я полагаю, что это может продолжаться гораздо дольше, если нет потерянных пакетов во время передачи, и реализация не мешает вам пытаться сделать это.
По умолчанию, реализация ZMODEM в Tera Term будет работать на полной скорости, которую позволяет скорость передачи по последовательному каналу.
В зависимости от удаленного конца полная скорость может перегрузить последовательные буферы или способность удаленного конца хранить данные (на жесткий диск, последовательный чип флэш-памяти и т.д.). Это может привести к зависанию.
В Tera Term есть параметры конфигурации ZMODEM в файле конфигурации Tera Term TERATERM.INI
. См. параметры для передачи ZMODEM. Файл конфигурации, скорее всего, находится в
C:\Users\<username>\AppData\Roaming\teraterm5\TERATERM.INI
Если вы установите параметр ZmodemWinSize
на 0, то Tera Term будет делать паузу в конце каждого буфера длины (указанной в ZmodemDataLen
) и ждать ответа ZACK от удаленного конца. Это эффективно ограничивает скорость передачи данными, которые удаленный конец может обработать.
Я отправил запрос на изменение в проекте Tera Term, чтобы, если приемник не устанавливает флаг CANFDX
в сообщении ZRINIT
, Tera Term автоматически устанавливал размер окна на 0. См. запрос на изменение №408 ZMODEM send: Disable window if receiver does not set CANFDX flag.
.
Ответ или решение
Конфликт передачи данных через ZMODEM: Проблема передачи больших файлов через TCP на Raspberry Pi с использованием UART-WiFi моста
Введение
Если у вас возникли проблемы с передачей больших файлов на Raspberry Pi Compute Module 3+ через UART-WiFi соединение, и вы используете ZMODEM в TeraTerm на Windows 10, не удивляйтесь. Такая ситуация встречается нередко при работе с сериал-протоколами, особенно когда объем данных превышает возможности системы.
Основная проблема
На первый взгляд, подключение Raspberry Pi через UART-WiFi мост с ESP8266, кажется надежным. Однако наблюдается зависание передачи при работе с файлами большего размера (например, Excel или .stl), что вызывает компликации в процессе передачи данных. Даже после улучшения антенны на мосту, ситуация не изменилась. Это указывает на возможные ограничения на стороне программного обеспечения или аппаратного интерфейса.
Потенциальные причины и решения
-
Ошибка настройки потока передачи данных (Flow Control):
Скорее всего, проблема заключается в неправильной настройке управления потоком между устройствами. UART может не обрабатывать входящие данные должным образом, если скорость передачи данных превышает его возможности. Рекомендуется отключить аппаратный контроль потока на Raspberry Pi и настроить задержки между пакетами на PC. -
Настройки и конфигурации TeraTerm:
TeraTerm предполагает возможность автоматической передачи данных на максимально доступной скорости для серийного baud rate. В файле конфигурацииTERATERM.INI
можно настроить такие параметры, какZmodemWinSize
иZmodemDataLen
, чтобы обеспечить большую устойчивость передачи. УстановкаZmodemWinSize
в нуль будет приводить к паузе в конце каждого буфера и ожиданию подтверждения от принимающего устройства. -
Проблемы с аппаратной частью WiFi моста:
Хотя улучшили антенну, возможно, что сам ESP8266 не справляется с объемом данных. Это может происходить из-за ограниченной буферизации или недостаточного аппаратного обеспечения.
Рекомендации по экспериментам и улучшению
- Изучение документации: Подробное изучение документации TeraTerm и характеристик UART-WiFi моста может выявить подходящие настройки и необходимые изменения.
- Тестирование с разными файлами: Попробуйте тестировать передачу с различными типами файлов, чтобы понять, имеет ли значение тип содержимого.
- Ограничение скорости передачи: Путем ручного ограничения скорости передачи данных можно избежать переполнения буфера, что позволит данные обрабатываться без задержек.
Заключение
Сталкиваясь с проблемами передачи через ZMODEM с Raspberry Pi и UART-WiFi мостом, важно удостовериться, что настройки программного обеспечения и аппаратного обеспечения оптимизированы. Для минимизации подобных проблем рекомендуется экспериментировать с параметрами конфигурации и внимательно изучать обратную связь от устройств. Это обеспечит более стабильное соединение и успешную передачу данных даже больших объемов.