с гипертерминалом дельного что-то ничего не получилось, так что вводим эхозащищенную модификацию xmodem-crc.
управляющие символы:
- Код: Выделить всё • Развернуть
_eot = &H04 'End of Transmission
_ack = &H06 'Acknowledge
_nack = &H15 'Not Acknowledge
_c = &H43 'ACII "C"
_can = &H18 'Cancel Transmission
новый символ - _can означает отмену передачи/приема, отсылается только приемной строной. необходимость в нём может возникнуть в случае пропуска целого пакета (ситуацию можно отследить по двум packet number байтам). кстати, маркеры пакета и команды управления передачей полностью различны у передатчика (_sot,_eot) и приемника (_ack,_nack,_c,_can).
чуть изменился пакет:
- Код: Выделить всё • Развернуть
[Start of Header] [Packet Number] [~Packet Number] (Packet Data,base64) [[16 bit CRC]] [End of Packet]
квадратные скобки - один байт
~Packet Number - дополнение Packet Number до 0xFF, т.е. Packet Number + ~Packet Number = 0xFF
данные передаются в base64, что автоматически не допускает возможность подмены управляющих символов последовательностью данных. далее, crc16 считается для пакета данных, а не их base64 представления, чтобы зря не терять точности обнаружения ошибок. символ конца пакета позволяет передавать сколь угодно малую порцию файла (нужно для экономии оперативной памяти на устройстве).
благодаря модификации удалось получить:
- произвольный размер пакета (но из-за base64 кодировки обязательно кратный 4 байтам)
- полная защита от эхо-эффекта
- возможность прервать передачу
как это все работает:
- приемник отсылает _c, символизирующий готовность принять данные. если передатчик не среагировал, то отправка повторяется ещё 2 раза. если же и на этот раз возникла ошибка, то операция прерывается.
- передатчик отсылает пакет под номером 1.
- приемник может ответить тремя способами:
- _ack - пакет принят без ошибок, жду следующий
- _nack - пакет повредился, нужен повтор
- _can - прервать операцию
- передатчик соотвественно команде либо отсылает новый пакет, либо повторяет предыдущий
- допустим, номер пакета вышел за границы 0xFF, тогда следующий номер - 0x00
- после последнего пакета передатчик отсылает символ _eot до тех пор, пока не получит _ack или _can