1 概述
XMODEM协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据,并且每个块都使用一个校验和过程来进行错误检测。使用循环冗余校验的与XMODEM相应的一种协议称为XMODEM-CRC。还有一种是XMODEM-1K,它以1024字节一块来传输数据。YMODEM也是一种XMODEM的实现。它包括XMODEM-1K的所有特征,另外在一次单一会话期间为发送一组文件,增加了批处理文件传输模式。
本文利用C++实现XYModem-1K协议,并利用Qt串口类QSerialPort实现数据读写。
3 实现
3.1 Modem
该模块定义和实现了Modem类型。
3.1.1 Modem定义
class Modem
{
public:Modem();
protected:virtual uint32_t write(uint8_t const *data, uint32_t size) = 0;virtual uint32_t read(uint8_t *data, uint32_t size) = 0;uint16_t crc16(uint8_t const *data, uint32_t size);
};
虚函数列表:
- write 向串口写数据
- read 从串口读数据
函数列表:
- crc16 CRC16校验函数
3.1.2 Modem实现
Modem::Modem()
{
}uint16_t Modem::crc16(uint8_t const *data, uint32_t size)
{uint16_t crc = 0;while(size--){crc ^= (uint16_t)(*(data++)) << 8;for(int i = 0; i < 8; i++){if(crc & 0x8000)crc = (crc << 1) ^ 0x1021;elsecrc = crc << 1;}}return crc;
}
说明:
函数crc16的实现数据的CRC16校验。