Xmodem协议概述
Xmodem是一种广泛使用的文件传输协议,设计用于通过串行通信(如RS-232)传输小型文件。协议最初由Ward Christensen在1977年提出,具有简单、可靠的特点,常用于嵌入式系统、旧式调制解调器通信等场景。
协议核心特性
- 数据块大小:默认128字节(可扩展为1K版本)。
- 校验方式:支持8位校验和(Checksum)或16位CRC校验(Xmodem-CRC)。
- 错误处理:通过ACK/NAK信号实现重传机制。
- 传输模式:半双工,发送方需等待接收方确认后再发送下一块数据。
传输流程
初始化阶段 接收方发送NAK(0x15)表示准备接收数据,使用校验和模式;若发送字母'C'(0x43),则启用CRC模式。发送方检测到信号后开始传输。
数据块结构 每块数据包含以下部分:
- 包头(SOH/STX):SOH(0x01)表示128字节块,STX(0x02)表示1K字节块。
- 块编号:1字节,从1开始递增。
- 块编号补码:块编号的按位取反(用于验证)。
- 数据区:固定长度(128字节或1024字节),不足部分用填充字节(通常为0x1A)。
- 校验值:1字节校验和或2字节CRC。
校验计算示例
- 校验和:数据区所有字节相加,取低8位。
- CRC-16:多项式为0x1021,初始值为0x0000。
确认机制 接收方校验通过后发送ACK(0x06),失败则发送NAK(0x15)。连续多次失败(通常10次)会终止传输。
终止流程
发送方传输结束时发送EOT(0x04),接收方回复ACK确认。若接收方主动取消,可发送CAN(0x18)两次。
代码实现示例(伪码)
// 发送方逻辑
void send_xmodem(FILE *file) {
uint8_t buffer[1024];
uint8_t block_num = 1;
while (!feof(file)) {
read_block(file, buffer);
send_block(block_num, buffer);
if (wait_ack() == NAK) {
retransmit_block();
}
block_num++;
}
send_eot();
}
// 接收方逻辑
void receive_xmodem(FILE *file) {
send_nak(); // 或 'C' 启用CRC
while (true) {
if (receive_block(&block) == SUCCESS) {
write_block(file, block);
send_ack();
} else {
send_nak();
}
if (received_eot()) break;
}
}
优缺点分析
优点
- 实现简单,适合资源受限的设备。
- 错误检测机制保障基础可靠性。
缺点
- 传输效率低(需等待ACK)。
- 固定块大小可能导致小文件传输浪费带宽。
变种协议
- Xmodem-1K:块大小扩展至1024字节,提升大文件传输效率。
- Xmodem-CRC:采用CRC-16校验,错误检测能力更强。
- Ymodem:在Xmodem-1K基础上增加批传输和文件名支持。
典型应用场景
- 嵌入式系统固件升级。
- 工业设备通过串口配置。
- 旧式BBS文件传输。
注:实际实现需根据硬件平台调整超时时间、重试次数等参数。
4796

被折叠的 条评论
为什么被折叠?



