Полный технический текст китайского RK-KF-YF-076 V1.0.0, стр.6–9. Продукт/версия указаны как общие, без проверки конкретных плат ArmSoM, SoC или BSP. Это справочник RT-Thread, не ядра Linux. Проверьте реальные исходники RT-Thread, UART, уровни напряжения, DFS и прошивку. Английского PDF нет; четыре оригинальных рисунка китайского PDF используются во всех языках, даже если подписи внутри английские. Производительность и совместимость — исторические данные источника, не испытания ArmSoM.
Оговорка редакции: утверждения о системе счисления File_size, повторах при CRC и безвредности 0x1A сохранены, но не распространены на все реализации Ymodem. Особенно для двоичной прошивки проверяйте реализацию, длину и контрольную сумму до и после передачи; заполнение нельзя считать автоматически безвредным. Совместимость и upstream относятся только ко времени источника.
1. Принцип работы
Ymodem передаёт файлы через последовательный порт и происходит от Xmodem. Блоки по 128 или 1024 байт образуют пакеты по 133 или 1029 байт. Источник описывает CRC16 и прекращение передачи при ошибке проверки. При разработке Chuck Forsberg предусмотрел варианты размера пакета, проверки и повторной передачи; источник связывает множество разновидностей с необязательностью этих функций. Реализации могут быть несовместимы. RT-Thread ориентирован прежде всего на SecureCRT. Обмен отправителя и получателя состоит из согласования, передачи и завершения.

Обмен отправителя и получателя Ymodem
1.1 Согласование
Получатель периодически посылает C (0x43), здесь раз в 1s. Отправитель отвечает SOH|0x00|0xFF|File_name 00 File_size NULL|CRC16|. SOH (0x01) обозначает блок 128 байт; для 1024 байт используется STX (0x02). 0x00 — номер пакета, 0xFF — его инверсия. File_name задаёт имя принимаемого файла, File_size — выделяемое место хранения. Источник утверждает, что File_size обычно содержит число байт в шестнадцатеричном ASCII, а SecureCRT использует десятичный ASCII. Последние два байта — CRC16. Получатель отвечает ACK (0x06), затем C (0x43), начиная передачу. Если после повторных C пакет не приходит, происходит тайм-аут; здесь допускаются 10 попыток.
1.2 Передача
Отправитель посылает SOH|0x01|0xFE| Data[0~127] |CRC16|; получатель отвечает ACK (0x06), после чего передаётся следующий пакет. По источнику SecureCRT при ошибке пакета не запрашивает повтор через NAK (0x15), а прекращает передачу. В исходном тесте по описанной ниже методике файл более 5M при 115200 бод был передан без ошибок. Последний пакет: SOH|0x??|0x??| Data[0~??] 0x1A |CRC16|. Неполный блок дополняется до 128 байт значением 0x1A, соответствующим Ctrl+Z/концу файла. Источник считает завершающие 0x1A нормальными и не влияющими на использование файла; см. оговорку выше. Отправка CAN (0x18) или Ctrl+C в терминале отменяет передачу.
1.3 Завершение
Отправитель посылает EOT (0x04). Получатель запрашивает подтверждение через NAK (0x15); отправитель повторяет EOT (0x04), а получатель отвечает ACK (0x06), завершая файл. Затем C (0x43) запрашивает следующий файл. Если файлов больше нет, отправляется SOH|0x00|0xFF| NULL |CRC16|, на что получатель отвечает ACK (0x06). Сеанс завершён.
2. Применение
2.1 Настройка Ymodem
Протокол и примеры находятся в /components/utilities/ymodem: ymodem.c и ymodem.h реализуют протокол, ry_sy.c — приём и передачу файлов. Запустите scons --menuconfig и включите Ymodem в Utilities. Другие производители часто применяют его для OTA в RT-Thread без зависимости от DFS. Rockchip использует в основном передачу файлов, поэтому ry_sy.c читает и записывает DFS. Включение передачи файлов активирует команды ry_sy. Необязательный CRC Table заменяет прямой расчёт поиском по таблице. Теоретически это быстрее, но источник не отмечает существенного выигрыша для блоков 128 байт при 115200 бод; отключение экономит память. Соберите и загрузите настроенную прошивку, затем используйте Ymodem через последовательный порт.
RT-Thread Components --->
Utilities --->
[*] Enable Ymodem
[ ] Enable CRC Table in Ymodem
[*] Enable file transfer feature
2.2 Приём файлов
По умолчанию приём использует Console; аргумент выбирает другой UART. Введите ry: Console выводит C в ожидании хоста. В SecureCRT выберите Transfer → Send Ymodem и файл. Приём сопровождается индикацией хода. Для другого устройства используйте, например, ry uart2. На время передачи любой вывод в последовательный порт запрещается.

Исходный пример приёма файла
msh />ry
CCCC
Starting ymodem transfer. Press Ctrl+C to cancel.
Transferring test.mp3...
100% 2476 KB 3 KB/sec 00:10:51 0 Errors
По умолчанию файлы сохраняются в корневом каталоге. Измените fpath в _rym_recv_begin файла ry_sy.c для выбора другого пути.
2.3 Передача файлов
Передача также использует Console по умолчанию; аргумент задаёт другой UART. Введите sy file_path и ожидайте хост. В SecureCRT выберите Transfer → Receive Ymodem. Отображается ход передачи. Для uart2 используйте sy file_path uart2. На время передачи любой вывод в последовательный порт запрещается.

Исходный пример отправки файла
msh />sy /test.mp3
Starting ymodem transfer. Press Ctrl+C to cancel.
Transferring test.mp3...
100% 2476 KB 3 KB/sec 00:10:52 0 Errors
Используйте абсолютный путь; относительные пути этой версией не поддерживаются. Имя принятого файла содержит весь путь. При необходимости измените _rym_send_begin в ry_sy.c, чтобы разобрать путь и удалить каталоги из имени.
3. Известные проблемы и направления улучшения
На момент выпуска источника протокол и пример приложения уже были включены в основную ветку RT-Thread, что показано на рисунке. Перечислены дальнейшие направления:
-
Поддержать отправку блоков по 1024 байт.
-
При 115200 бод скорость держалась около 4kB/s. Повышение до 1.5M и выше приводило к ошибкам передачи.
-
При 115200 бод теоретический предел составлял 11kB/s, практический — 8kB/s; накладные расходы протокола велики.
-
Поддержать больше терминальных программ.

Исходный снимок записи слияния RT-Thread
4. Совместимость по исходному документу
| ОС | Терминал | Приём | Передача |
|---|---|---|---|
| Windows | SecureCRT | Поддерживается | Поддерживается |
| MacOS | SecureCRT | Не поддерживается | Поддерживается |
| MacOS | Minicom | Не поддерживается | Не поддерживается |
| Linux | Minicom | Поддерживается | Не поддерживается |
