【QT】基于UDP/TCP/串口的Ymodom通讯协议客户端
前言
Qt 运行环境 Desktop_Qt_5_11_2_MSVC2015_64bit ,基于Ymodom通讯协议,开发客户端实现与设备的UDP /TCP /串口通讯。在前期测试过程中,主要用了网络调试助手、串口调试助手、Virtual Serial Port Driver虚拟串口。
对Ymodom的了解过程中,主要学习了博文Ymodem协议详解 、【嵌入式——QT】QT集成Ymodem协议使用UDP进行传输、qt随手记——ymodem协议使用,里面对协议的规则进行了详细的讲述,方便理解Ymodom 是什么。
在没有设备的情况下,用虚拟设备进行测试,发一个文件对应的指令如下:
43 ( C)
--
06 ( Ack)
43 ( C)
......
06 ( Ack)
----
04 (收 Eot)
15 ( NAK)
04 (收 Eot)
06 ( Ack)
43 ( C)
--
06 ( Ack)
Ymodom实现
该协议包括起始帧、数据帧、结束帧,状态变量流转的方向如下:
YmodemFileTransmit.h
status : StatusEstablish->StatusTransmit ->StatusFinish
ymodem.h
stage: StageNone-> StageEstablishing -> StageEstablished -> StageTransmitting->StageFinishing->StageFinished ->StageNone
code: CodeNone
里面数据帧要注意,传1024或128规则如下:
- 数据大于128,则按1024传;
- 数据小于128,则按128传。
关于数据填充,看网上说是,以0x1A填充,但实际测试发现,是按照00填充的。
整个指令流程如下:
- 接收方先发 43(C)
- 发送方发 文件名+文件大小
- 接收方发 06(Ack)
- 接收方发 43(C)
- 发送方开始一包包数据的发送,每发一包得等接收方回复 06(Ack)后再开始下一包
- 当发完最后一包数据后,发送方发 04 (Eot)
- 接收方发 15( NAK)
- 发送方再发 04 (Eot)
- 接收方发 06 ( Ack)
- 接收方发 43(C),开始下一个文件传输
- 如果不在发文件,则发送方发一包00数据
- 接收方发 06(Ack),结束传输。
在传输中,使用的指令主要如下:
CodeNone = 0x00,
CodeSoh = 0x01, //128字节数据包;
CodeStx = 0x02, //1024字节数据包;
CodeEot = 0x04, //文件传输结束指令;
CodeAck = 0x06, //接收正确指令;
CodeNak = 0x15, //重传当前数据包请求指令;
CodeCan = 0x18, //取消传输指令,连续发送5个该命令,终止传输;
CodeC = 0x43, //请求数据包
CodeA1 = 0x41,
CodeA2 = 0x61
QT实现
主要用得是Ymodem的开源库函数,然后对其进行二次开发。