The original XMODEM also has the disadvantage that you
must transfer 128 byte blocks, as I recall; there's no provision to make the last block shorter. (In CP/M binary file length was always a multiple of 128 bytes or sector size, and text files had their end indicated with Ctrl-Z.) So this might be annoying when you want to send something to the board just "underneath" something you don't want to overwrite. Later varients of XMODEM fix this, but of course are more work to implement.
Way back when I was looking through protocols for transfer stuff to microcomputer boards, I thought that Kermit looked like one of the better options. It's far from the speediest, but that's not a huge issue on modern 115 kpbs links, the most basic version is fairly simple to implement, and IIRC it had some good (and well-supported in host programs) options for transfer auto-start on one end so that you could type just one command on either end to send the file, rather than having to type something on each end.
But of course with S records if you make the monitor command to receive them `S` you have more or less the same thing, and also then don't need to deal with addresses in your command lines for programs. But you need to deal with host-side conversions of data for other things (such as a ROM you want to download to burn for another machine) and upload to the host may also be a bit more work.
Regarding error checking, strength of checksums and the like, I recommend including a CRC-16 routine into your monitor that you can run on arbitrary sections of memory. This can not only identify transfer errors but also things like corrupted memory, hardware errors when reading memory, and that sort of thing.
gfoot wrote:
I used XMODEM on a recent project just because it's well supported by off-the-shelf terminal software, which is also handy regardless of whether you need the checksums and retries.
Sure, but off-the-shelf software also generally supports "text" upload, which works fine to send S record files as those use only printable and line ending characters.