UART 是底层串行传输协议YMODEM 是建立在 UART 之上的文件传输应用层协议常用于嵌入式 Bootloader/IAP 固件升级。下面分两部分详解。第一部分UART 协议解析一、UART 基本概念UARTUniversal Asynchronous Receiver/Transmitter通用异步收发器是一种异步、全双工、串行通信协议。特性说明同步方式异步无独立时钟线靠约定波特率通信方式全双工线数最少 2 根TX发送 RX接收共地数据方向TX↔RX 交叉连接Apply设备A 设备B TX ───────────────► RX RX ◄─────────────── TX GND ────────────── GND二、UART 帧格式核心UART没有时钟线收发双方必须事先约定相同的波特率并按固定帧格式收发。空闲(高) │起始位│ D0 D1 D2 D3 D4 D5 D6 D7 │校验位│停止位│ 空闲(高) ─────┐ ┌──────────────────────────────────────┐ ┌──── └─┘ LSB MSB └─┘ 起始 ←──────── 数据位 ────────→ 奇偶 停止 (低) (低位先发,LSB first) 校验 (高)1. 各字段说明字段位宽说明空闲态—高电平逻辑 1起始位1 bit固定为 低电平 0标志一帧开始数据位5~9 bit常用 8LSB 先发低位在前校验位0 或 1 bit奇校验/偶校验/无校验停止位1 / 1.5 / 2 bit固定为高电平 1标志一帧结束2. 常见配置表示法如115200 8N1表示波特率 115200 bps8 个数据位N No parity无校验1 个停止位三、波特率与采样1. 波特率Baud Rate每秒传输的位数bps。常见值9600、19200、38400、57600、115200。每一位的时间 tbit1波特率tbit波特率1例115200 bps → 每位约8.68 µs。2. 接收采样机制接收方通常以16 倍波特率过采样检测到起始位下降沿后延迟半个位时间在每个数据位的中点采样最稳定起始位下降沿检测 → 等待 0.5 bit → 在每 bit 中央采样 ↓ SDA ─┐ ┌─x─┐ ┌─x─┐ └─x─┘ └─x─┘ ↑采样点在每位中心四、UART 数据解析示例假设接收到一帧约定8N1要传输字符AASCII 0x41 二进制 0100_0001时序电平含义空闲1总线空闲起始位0帧开始D01bit0LSBD10bit1D20bit2D30bit3D40bit4D50bit5D61bit6D70bit7MSB停止位1帧结束还原LSB first读出顺序 D0→D7 1000_0010倒序得0100_00010x41 A✓关键UART 是LSB 先发解析时要把采样位序反过来组成字节。五、UART 常见信号线含流控信号全称作用TXTransmit发送数据RXReceive接收数据RTSRequest To Send请求发送流控CTSClear To Send允许发送流控GNDGround共地必须多数嵌入式应用只用 TX/RX/GND 三线。六、UART 常见错误错误原因帧错误Framing Error停止位不是高电平波特率不匹配奇偶校验错误校验位不符溢出错误Overrun接收缓冲未及时读取新数据覆盖乱码波特率设置错误是最常见原因第二部分YMODEM 协议解析一、YMODEM 概述YMODEM是基于串口UART的文件传输协议是 XMODEM 的增强版广泛用于嵌入式设备固件升级Bootloader/IAP。特性说明传输介质UART 串口数据块大小128 字节 或 1024 字节1K-YMODEM校验方式CRC-16流程控制接收方主动发起发 C 请求增强点支持文件名、文件大小传输支持批量文件二、YMODEM 关键控制字符字符值Hex含义SOH0x01数据块开始128 字节数据块STX0x02数据块开始1024 字节数据块EOT0x04传输结束End of TransmissionACK0x06应答正确接收NAK0x15非应答错误要求重传CAN0x18取消传输C0x43接收方请求开始C 表示用 CRC 校验三、YMODEM 数据包格式┌─────┬──────┬──────────┬──────────────┬─────────┐ │ 包头 │ 包序号│ 包序号反码 │ 数据区 │ CRC-16 │ │ 1字节│ 1字节 │ 1字节 │ 128/1024字节 │ 2字节 │ └─────┴──────┴──────────┴──────────────┴─────────┘ SOH/STX SEQ ~SEQ Data CRC字段字节说明包头1SOH(0x01)128字节包 / STX(0x02)1024字节包包序号1从 0 开始递增0,1,2,...回绕到0序号反码1包序号取反 255 - SEQ用于校验数据区128/1024实际数据不足填充常用 0x1A 或 0x00CRC-162对数据区做 CRC16-CCITT 校验高字节在前四、YMODEM 传输完整流程YMODEM 分三个阶段起始帧文件信息→ 数据帧 → 结束帧。整体流程图接收方(R) 发送方(S) │ │ │────────── C ─────────────────►│ 请求开始(CRC模式) │ │ │◄────── 第0包(文件名大小) ────────│ 起始帧 │─────────── ACK ─────────────────►│ │─────────── C ─────────────────►│ 请求数据 │ │ │◄────── 第1包(数据) ──────────────│ 数据帧 │─────────── ACK ─────────────────►│ │◄────── 第2包(数据) ──────────────│ │─────────── ACK ─────────────────►│ │ ...... │ │◄────────── EOT ──────────────────│ 发送结束 │─────────── NAK ─────────────────►│ (第一次回NAK) │◄────────── EOT ──────────────────│ │─────────── ACK ─────────────────►│ │─────────── C ─────────────────►│ 请求下一个文件 │ │ │◄────── 第0包(全0,空文件名) ───────│ 结束帧(批次结束) │─────────── ACK ─────────────────►│ 传输完成1. 起始帧第 0 包—— 文件信息YMODEM 相比 XMODEM 最大的改进第 0 包传输文件名和大小。SOH 0x00 0xFF │ 文件名\0 文件大小(ASCII)\0 填充... │ CRC16数据区内容示例firmware.bin 0x00 102400 0x00 0x00 0x00 ...填充至128字节 文件名 分隔 文件大小 分隔 填充字段说明文件名ASCII 字符串以 \0 结尾文件大小十进制 ASCII 字符串以 \0 结尾如 102400填充剩余字节填 0接收方据此预先知道文件名和总大小可分配空间、显示进度。2. 数据帧第 1~N 包SOH/STX │ SEQ │ ~SEQ │ 数据(128/1024) │ CRC16包序号从1开始递增每收到一包接收方校验 CRC 和序号正确 → 回ACK请求下一包错误 → 回NAK要求重传最后一包数据不足时用0x1ACTRL-Z填充3. 结束帧(1) 单个文件结束EOT发送方 → EOT(0x04) 接收方 → NAK 第一次故意回 NAK 发送方 → EOT(0x04) 再发一次 接收方 → ACK 确认双重 EOT 握手是为了可靠确认传输结束。(2) 批次结束帧空包所有文件传完后发送方再发一个第 0 包但文件名为空全 0SOH 0x00 0xFF │ 0x00 0x00 ... 0x00全0│ CRC16接收方回 ACK整个传输会话结束。五、CRC-16 校验算法YMODEM 使用CRC-16/CCITT多项式 0x1021初值 0x0000uint16_t crc16_ccitt(uint8_t *data, uint16_t len) { uint16_t crc 0x0000; for (uint16_t i 0; i len; i) { crc ^ (uint16_t)data[i] 8; for (uint8_t j 0; j 8; j) { if (crc 0x8000) crc (crc 1) ^ 0x1021; else crc crc 1; } } return crc; }CRC 存放在数据包末尾 2 字节高字节在前大端。六、YMODEM 数据包解析示例假设抓到一个起始帧传输app.bin大小 1024 字节偏移字节解析00x01SOH128 字节包10x00包序号 0起始帧20xFF序号反码0xFF ~0x00✓3~961 70 70 2E 62 69 6Eapp.bin100x00文件名结束符11~1431 30 32 341024文件大小 ASCII150x00分隔符16~13000...00填充131~132xx xxCRC-16接收方解析后得知文件名 app.bin大小 1024 字节回 ACK C 开始接收数据。七、UART 与 YMODEM 的层次关系┌─────────────────────────────────────┐ │ 应用层YMODEM 文件传输协议 │ │ (数据包、序号、CRC、ACK/NAK、文件名) │ ├─────────────────────────────────────┤ │ 物理/链路层UART │ │ (起始位、数据位、校验位、停止位、波特率) │ ├─────────────────────────────────────┤ │ 硬件TX / RX / GND 线 │ └─────────────────────────────────────┘YMODEM 的每个字节SOH、SEQ、数据、CRC...都是通过UART 一帧一帧8N1发送出去的。UART 负责怎么传一个字节YMODEM 负责怎么把字节组织成可靠的文件传输。八、典型应用Bootloader 固件升级嵌入式 IAP 升级流程1. 设备上电进入 Bootloader 2. Bootloader 通过 UART 不断发送 C 3. PC 端如 SecureCRT/Xshell选择 YMODEM 发送固件 4. 设备按 YMODEM 协议接收数据包 5. 每收到一包CRC 校验通过后写入 Flash 6. 接收完成结束帧校验整体跳转到 App 运行SecureCRT、Xshell、Tera Term、sb/rbLinux lrzsz 工具都支持 YMODEM 发送/接收。九、UART vs YMODEM 对比总结维度UARTYMODEM层次物理/链路层应用层传输单位1 字节1 帧1 数据包128/1024字节可靠性仅奇偶校验CRC-16 序号 ACK/NAK 重传文件信息无支持文件名、大小流控硬件 RTS/CTSACK/NAK 软件握手用途通用字节传输文件/固件传输十、总结协议一句话总结UART异步串行约定波特率起始位(0)数据位(LSB先发)校验位停止位(1) 构成一帧负责可靠地传一个字节YMODEM建立在 UART 之上的文件传输协议起始帧传文件名/大小 → 数据帧(带序号CRC) → ACK/NAK 重传 → EOT/空帧结束负责可靠地传整个文件核心关系YMODEM 是内容组织者UART 是字节搬运工。固件升级时YMODEM 把固件切成带校验的数据包再由 UART 逐字节搬运过去。
UART 协议与 YMODEM 协议解析
UART 是底层串行传输协议YMODEM 是建立在 UART 之上的文件传输应用层协议常用于嵌入式 Bootloader/IAP 固件升级。下面分两部分详解。第一部分UART 协议解析一、UART 基本概念UARTUniversal Asynchronous Receiver/Transmitter通用异步收发器是一种异步、全双工、串行通信协议。特性说明同步方式异步无独立时钟线靠约定波特率通信方式全双工线数最少 2 根TX发送 RX接收共地数据方向TX↔RX 交叉连接Apply设备A 设备B TX ───────────────► RX RX ◄─────────────── TX GND ────────────── GND二、UART 帧格式核心UART没有时钟线收发双方必须事先约定相同的波特率并按固定帧格式收发。空闲(高) │起始位│ D0 D1 D2 D3 D4 D5 D6 D7 │校验位│停止位│ 空闲(高) ─────┐ ┌──────────────────────────────────────┐ ┌──── └─┘ LSB MSB └─┘ 起始 ←──────── 数据位 ────────→ 奇偶 停止 (低) (低位先发,LSB first) 校验 (高)1. 各字段说明字段位宽说明空闲态—高电平逻辑 1起始位1 bit固定为 低电平 0标志一帧开始数据位5~9 bit常用 8LSB 先发低位在前校验位0 或 1 bit奇校验/偶校验/无校验停止位1 / 1.5 / 2 bit固定为高电平 1标志一帧结束2. 常见配置表示法如115200 8N1表示波特率 115200 bps8 个数据位N No parity无校验1 个停止位三、波特率与采样1. 波特率Baud Rate每秒传输的位数bps。常见值9600、19200、38400、57600、115200。每一位的时间 tbit1波特率tbit波特率1例115200 bps → 每位约8.68 µs。2. 接收采样机制接收方通常以16 倍波特率过采样检测到起始位下降沿后延迟半个位时间在每个数据位的中点采样最稳定起始位下降沿检测 → 等待 0.5 bit → 在每 bit 中央采样 ↓ SDA ─┐ ┌─x─┐ ┌─x─┐ └─x─┘ └─x─┘ ↑采样点在每位中心四、UART 数据解析示例假设接收到一帧约定8N1要传输字符AASCII 0x41 二进制 0100_0001时序电平含义空闲1总线空闲起始位0帧开始D01bit0LSBD10bit1D20bit2D30bit3D40bit4D50bit5D61bit6D70bit7MSB停止位1帧结束还原LSB first读出顺序 D0→D7 1000_0010倒序得0100_00010x41 A✓关键UART 是LSB 先发解析时要把采样位序反过来组成字节。五、UART 常见信号线含流控信号全称作用TXTransmit发送数据RXReceive接收数据RTSRequest To Send请求发送流控CTSClear To Send允许发送流控GNDGround共地必须多数嵌入式应用只用 TX/RX/GND 三线。六、UART 常见错误错误原因帧错误Framing Error停止位不是高电平波特率不匹配奇偶校验错误校验位不符溢出错误Overrun接收缓冲未及时读取新数据覆盖乱码波特率设置错误是最常见原因第二部分YMODEM 协议解析一、YMODEM 概述YMODEM是基于串口UART的文件传输协议是 XMODEM 的增强版广泛用于嵌入式设备固件升级Bootloader/IAP。特性说明传输介质UART 串口数据块大小128 字节 或 1024 字节1K-YMODEM校验方式CRC-16流程控制接收方主动发起发 C 请求增强点支持文件名、文件大小传输支持批量文件二、YMODEM 关键控制字符字符值Hex含义SOH0x01数据块开始128 字节数据块STX0x02数据块开始1024 字节数据块EOT0x04传输结束End of TransmissionACK0x06应答正确接收NAK0x15非应答错误要求重传CAN0x18取消传输C0x43接收方请求开始C 表示用 CRC 校验三、YMODEM 数据包格式┌─────┬──────┬──────────┬──────────────┬─────────┐ │ 包头 │ 包序号│ 包序号反码 │ 数据区 │ CRC-16 │ │ 1字节│ 1字节 │ 1字节 │ 128/1024字节 │ 2字节 │ └─────┴──────┴──────────┴──────────────┴─────────┘ SOH/STX SEQ ~SEQ Data CRC字段字节说明包头1SOH(0x01)128字节包 / STX(0x02)1024字节包包序号1从 0 开始递增0,1,2,...回绕到0序号反码1包序号取反 255 - SEQ用于校验数据区128/1024实际数据不足填充常用 0x1A 或 0x00CRC-162对数据区做 CRC16-CCITT 校验高字节在前四、YMODEM 传输完整流程YMODEM 分三个阶段起始帧文件信息→ 数据帧 → 结束帧。整体流程图接收方(R) 发送方(S) │ │ │────────── C ─────────────────►│ 请求开始(CRC模式) │ │ │◄────── 第0包(文件名大小) ────────│ 起始帧 │─────────── ACK ─────────────────►│ │─────────── C ─────────────────►│ 请求数据 │ │ │◄────── 第1包(数据) ──────────────│ 数据帧 │─────────── ACK ─────────────────►│ │◄────── 第2包(数据) ──────────────│ │─────────── ACK ─────────────────►│ │ ...... │ │◄────────── EOT ──────────────────│ 发送结束 │─────────── NAK ─────────────────►│ (第一次回NAK) │◄────────── EOT ──────────────────│ │─────────── ACK ─────────────────►│ │─────────── C ─────────────────►│ 请求下一个文件 │ │ │◄────── 第0包(全0,空文件名) ───────│ 结束帧(批次结束) │─────────── ACK ─────────────────►│ 传输完成1. 起始帧第 0 包—— 文件信息YMODEM 相比 XMODEM 最大的改进第 0 包传输文件名和大小。SOH 0x00 0xFF │ 文件名\0 文件大小(ASCII)\0 填充... │ CRC16数据区内容示例firmware.bin 0x00 102400 0x00 0x00 0x00 ...填充至128字节 文件名 分隔 文件大小 分隔 填充字段说明文件名ASCII 字符串以 \0 结尾文件大小十进制 ASCII 字符串以 \0 结尾如 102400填充剩余字节填 0接收方据此预先知道文件名和总大小可分配空间、显示进度。2. 数据帧第 1~N 包SOH/STX │ SEQ │ ~SEQ │ 数据(128/1024) │ CRC16包序号从1开始递增每收到一包接收方校验 CRC 和序号正确 → 回ACK请求下一包错误 → 回NAK要求重传最后一包数据不足时用0x1ACTRL-Z填充3. 结束帧(1) 单个文件结束EOT发送方 → EOT(0x04) 接收方 → NAK 第一次故意回 NAK 发送方 → EOT(0x04) 再发一次 接收方 → ACK 确认双重 EOT 握手是为了可靠确认传输结束。(2) 批次结束帧空包所有文件传完后发送方再发一个第 0 包但文件名为空全 0SOH 0x00 0xFF │ 0x00 0x00 ... 0x00全0│ CRC16接收方回 ACK整个传输会话结束。五、CRC-16 校验算法YMODEM 使用CRC-16/CCITT多项式 0x1021初值 0x0000uint16_t crc16_ccitt(uint8_t *data, uint16_t len) { uint16_t crc 0x0000; for (uint16_t i 0; i len; i) { crc ^ (uint16_t)data[i] 8; for (uint8_t j 0; j 8; j) { if (crc 0x8000) crc (crc 1) ^ 0x1021; else crc crc 1; } } return crc; }CRC 存放在数据包末尾 2 字节高字节在前大端。六、YMODEM 数据包解析示例假设抓到一个起始帧传输app.bin大小 1024 字节偏移字节解析00x01SOH128 字节包10x00包序号 0起始帧20xFF序号反码0xFF ~0x00✓3~961 70 70 2E 62 69 6Eapp.bin100x00文件名结束符11~1431 30 32 341024文件大小 ASCII150x00分隔符16~13000...00填充131~132xx xxCRC-16接收方解析后得知文件名 app.bin大小 1024 字节回 ACK C 开始接收数据。七、UART 与 YMODEM 的层次关系┌─────────────────────────────────────┐ │ 应用层YMODEM 文件传输协议 │ │ (数据包、序号、CRC、ACK/NAK、文件名) │ ├─────────────────────────────────────┤ │ 物理/链路层UART │ │ (起始位、数据位、校验位、停止位、波特率) │ ├─────────────────────────────────────┤ │ 硬件TX / RX / GND 线 │ └─────────────────────────────────────┘YMODEM 的每个字节SOH、SEQ、数据、CRC...都是通过UART 一帧一帧8N1发送出去的。UART 负责怎么传一个字节YMODEM 负责怎么把字节组织成可靠的文件传输。八、典型应用Bootloader 固件升级嵌入式 IAP 升级流程1. 设备上电进入 Bootloader 2. Bootloader 通过 UART 不断发送 C 3. PC 端如 SecureCRT/Xshell选择 YMODEM 发送固件 4. 设备按 YMODEM 协议接收数据包 5. 每收到一包CRC 校验通过后写入 Flash 6. 接收完成结束帧校验整体跳转到 App 运行SecureCRT、Xshell、Tera Term、sb/rbLinux lrzsz 工具都支持 YMODEM 发送/接收。九、UART vs YMODEM 对比总结维度UARTYMODEM层次物理/链路层应用层传输单位1 字节1 帧1 数据包128/1024字节可靠性仅奇偶校验CRC-16 序号 ACK/NAK 重传文件信息无支持文件名、大小流控硬件 RTS/CTSACK/NAK 软件握手用途通用字节传输文件/固件传输十、总结协议一句话总结UART异步串行约定波特率起始位(0)数据位(LSB先发)校验位停止位(1) 构成一帧负责可靠地传一个字节YMODEM建立在 UART 之上的文件传输协议起始帧传文件名/大小 → 数据帧(带序号CRC) → ACK/NAK 重传 → EOT/空帧结束负责可靠地传整个文件核心关系YMODEM 是内容组织者UART 是字节搬运工。固件升级时YMODEM 把固件切成带校验的数据包再由 UART 逐字节搬运过去。