一、X modem协议
X modem协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据,并且每个块都使用一个校验和过程来进行错误检测。Y MODEM也是一种X MODEM的实现。它包括X MODEM-1K的所有特征,另外在一次单一会话期间为发送一组文件,增加了批处理文件传输模式。
附: 一个基于stm32g030c8t6的xmodem IAP串口升级例子
1、帧格式
SOH 信息包序号 信息包序号反码 数据区段 算术校验和
**SOH:**开头字节,代表信息包中的第一个字节
**信息包序号:**对256取模得到当前包号,第一个信息包的序号为1,信息包的序号范围0~255
信息包序号的反码:
**数据区段:**数据区段的长度固定为 128 字节,其内容没有任何限制,可以是文本数据或二进制数据。如果最后一帧数据不满128字节,则使用 0x1A
填充剩余的空间。
**算术校验和:**2字节的16位CRC校验
2、控制字符
字符(16进制) | 含义 |
---|---|
0x01 | SOH:包头 |
0x04 | EOT:结束文件传输 |
0x06 | ACK:正常响应,如数据包正确接收 |
0x15 | NACK:非正常响应 |
0x17 | ETB:传输块结束 |
0x18 | CAN:取消文件传输 |
0x43 | C:通知对方发送带crc校验的数据包 |
解释:
- 带
CRC
的Xmodem
数据包的帧头只能是``SOH,EOT,CAN or ETB` - ‘C’是接收方用于通知发送方,它要求发送方发送带CRC校验的数据包
- ‘ACK’和‘NAK’是接收方对发送方的回应
3、通信流程
4、CRC计算
uint16_t crc16_xmodem(uint8_t *data, uint16_t length)
{
uint8_t i;
uint16_t crc = 0; // Initial value
while(length--)
{
crc ^= (uint16_t)(*data++) << 8; // crc ^= (uint16_t)(*data)<<8; data++;
for (i = 0; i < 8; ++i)
{
if ( crc & 0x8000 )
crc = (crc << 1) ^ 0x1021;
else
crc <<= 1;
}
}
return crc;
}