告别U盘拔插!手把手教你用lrzsz在Linux开发板和PC间传文件(附串口调试避坑)
2026/4/17 22:53:20 网站建设 项目流程

嵌入式开发实战:零成本搭建串口文件传输通道

第一次在嵌入式项目里遇到需要频繁传输测试文件时,我像大多数新手一样反复插拔着SD卡。直到某天深夜,当第二张存储卡因为物理损坏宣告报废,我才意识到必须找到更优雅的解决方案。这就是lrzsz工具链走进我技术栈的故事——它不仅能避免硬件损耗,传输速度更是比传统方式快3倍以上。

1. 为什么串口传输能改变开发流程

在嵌入式开发中,文件传输就像呼吸一样频繁。每次修改完驱动代码,都需要将编译好的二进制文件送到开发板验证。传统U盘/SD卡方式存在三个致命缺陷:

  • 物理损耗:开发板TF卡槽平均插拔寿命仅5000次
  • 时间成本:完整插拔流程耗时约45秒(含安全弹出等待)
  • 版本风险:多人协作时易混淆存储卡内容

而基于lrzsz的串口传输方案,只需要一根价值10元的USB转TTL线缆。实际测试显示,传输1MB文件仅需12秒(115200波特率下),且具备以下优势:

传输方式准备时间传输速度硬件依赖
U盘/SD卡30s5MB/s存储介质
网络共享60s2MB/s网卡驱动
lrzsz串口0s0.8MB/s串口线

提示:虽然单次传输速度不如U盘,但省去了插拔和挂载时间,在小型文件(<10MB)场景反而更快

2. 环境搭建:从零配置传输链路

2.1 硬件连接避坑指南

我遇到过最诡异的串口问题——线序正确却无法通信。后来发现是USB转串口芯片的驱动兼容性问题。以下是经过20+开发板验证的可靠方案:

  1. 线材选择

    • CH340G芯片的转换线(性价比最高)
    • FT232RL芯片的转换线(工业级稳定)
  2. 驱动安装检查(Linux主机):

    lsmod | grep usbserial dmesg | grep ttyUSB

    正常应看到类似输出:

    usbserial: USB Serial support registered for ch341-uart ch341-uart ttyUSB0: ch341-uart converter now disconnected
  3. 波特率匹配

    • 开发板控制台默认115200
    • 文件传输建议降至57600提升稳定性

2.2 终端软件选型对比

Putty的轻量有口皆碑,但确实缺少文件传输功能。经过多次测试,这些工具表现更佳:

  • Windows平台

    • MobaXterm(集成Zmodem协议)
    • SecureCRT(商业软件但功能完整)
  • Linux/macOS

    sudo apt install minicom minicom -s # 进入配置模式

    配置关键参数:

    Serial Device: /dev/ttyUSB0 Bps/Par/Bits: 115200 8N1 Hardware Flow Control: No

3. lrzsz移植全流程详解

3.1 交叉编译实战

最新版lrzsz-0.12.20在ARMv7架构上存在栈溢出漏洞,建议使用社区维护的0.12.21补丁版。编译过程需要注意交叉编译器的ABI兼容性:

wget https://ohse.de/uwe/releases/lrzsz-0.12.21.tar.gz tar zxvf lrzsz-0.12.21.tar.gz cd lrzsz-0.12.21

配置编译环境时,这个命令组合成功率最高:

CFLAGS="-O2 -fPIC" \ ./configure --host=arm-linux-gnueabihf \ --prefix=/usr/local/lrzsz \ --disable-protocols make -j4

注意:遇到"undefined reference to `rpl_malloc'"错误时,在configure后执行:

sed -i 's/^#define malloc rpl_malloc$//g' config.h

3.2 开发板部署技巧

编译生成的二进制文件约300KB,对于资源受限的设备可以考虑strip瘦身:

arm-linux-gnueabihf-strip src/lrz src/lsz

部署到开发板时,推荐使用符号链接保持系统一致性:

cp src/lrz /usr/bin/ cp src/lsz /usr/bin/ ln -sf /usr/bin/lrz /usr/bin/rz ln -sf /usr/bin/lsz /usr/bin/sz

验证安装是否成功:

which rz sz # 应返回/usr/bin/rz和/usr/bin/sz rz --version # 显示0.12.21版本信息

4. 高频问题解决方案库

4.1 传输中断的应急处理

当看到终端出现类似这样的错误时:

rz: line 1: �: not found rz: line 2: syntax error: word unexpected (expecting ")")

按这个流程恢复:

  1. 开发板端执行:
    stty sane reset
  2. PC端重新初始化串口:
    stty -F /dev/ttyUSB0 115200 cs8 -parenb -cstopb
  3. 再次尝试传输

4.2 大文件传输优化

传输超过50MB的文件时,建议采用分卷压缩配合校验:

# 开发板端接收多个分卷 for i in {1..5}; do rz -e -b # 接收part$i.zip done # 合并校验 md5sum *.zip > checksum.md5

4.3 自动化传输脚本示例

这个bash脚本实现了自动接收并验证文件完整性:

#!/bin/bash FILE=$1 MD5_EXPECTED=$2 echo "Waiting for $FILE via rz..." rz -b -e -y > /dev/null 2>&1 if [ ! -f "$FILE" ]; then echo "Error: File transfer failed!" >&2 exit 1 fi MD5_ACTUAL=$(md5sum "$FILE" | awk '{print $1}') if [ "$MD5_ACTUAL" != "$MD5_EXPECTED" ]; then echo "Error: MD5 mismatch!" >&2 exit 2 fi echo "Transfer successful: $FILE"

5. 进阶应用:构建完整工作流

在持续集成环境中,可以结合expect实现无人值守传输:

#!/usr/bin/expect -f set timeout 30 spawn minicom -D /dev/ttyUSB0 -b 115200 expect "login:" send "root\r" expect "Password:" send "\r" expect "#" send "rz -b -e\r" expect "waiting to receive" exec sz --md5sum $file_path expect "MD5" set md5 [lindex [split $expect_out(buffer) \n] end-1] expect "#" send "echo $md5 > /tmp/checksum\r"

这种方案特别适合以下场景:

  • 夜间自动化测试
  • 批量设备固件更新
  • 产线烧录校验

记得第一次成功用脚本完成整夜的压力测试后,第二天早上看到完整的日志文件时,那种解放双手的成就感至今难忘。现在我的开发板上永远留着rz/sz这两个不到300KB的小工具——它们可能不是最炫酷的技术,但绝对是嵌入式工程师工具箱里最实用的存在。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询