标签: zmodem

了解ZMODEM协议

我需要在我的程序中包含基本的文件发送和文件接收例程,它需要通过ZMODEM协议.问题是我无法理解规范.

作为参考,这是规范.

规范没有定义各种常量,所以这里是来自Google的头文件.

在我看来,在该文档中有许多重要的事情未定义:

  • 它经常引用ZDLE编码,但它是什么?我什么时候使用它,什么时候不使用它?
  • 在ZFILE数据帧之后,传输文件的元数据(文件名,修改日期,大小等).接下来是ZCRCW块,然后是根据规范未定义类型的块.据称ZCRCW块包含一个16位CRC,但规范没有定义CRC计算的数据.
  • 它没有定义它使用的CRC多项式.我偶然发现CRC32 poly是标准的CRC32,但我对CRC16 poly没有这么好的运气.没关系,我通过反复试验找到了它.CRC16多晶硅是0x1021.

我环顾四周寻找参考代码,但我能找到的是从90年代早期开始的无法读取的无证件C文件.我也从MSDN中找到了这组文件,但它与我运行的测试有点模糊和矛盾:http://msdn.microsoft.com/en-us/library/ms817878.aspx(你可能需要通过谷歌的缓存查看)

为了说明我的困难,这是一个简单的例子.我在服务器上创建了一个包含"Hello world!"的纯文本文件,它名为helloworld.txt.

我使用以下命令从服务器启动传输:

sx --zmodem helloworld.txt
Run Code Online (Sandbox Code Playgroud)

这会提示服务器发送以下ZRQINIT帧:

2A 2A 18 42 30 30 30 30 30 30 30 30 30 30 30 30   **.B000000000000
30 30 0D 8A 11                                    00.Š.
Run Code Online (Sandbox Code Playgroud)

这有三个问题:

  • 填充字节(0x2A)是否是任意的?为什么这里有两个,但在其他情况下只有一个,有时没有?
  • 该规范最后没有提到[CR] [LF] [XON],但是MSDN文章的确如此.为什么会这样?
  • 为什么[LF]设置了位0x80?

在此之后,客户端需要发送ZRINIT帧.我从MSDN文章中得到了这个:

2A 2A 18 42 30 31 30 30 30 30 30 30 32 33 62 65   **.B0100000023be
35 30 0D …
Run Code Online (Sandbox Code Playgroud)

protocols zmodem

11
推荐指数
2
解决办法
9003
查看次数

使用 zmodem/picocom/minicom 非交互传输文件

我们正在尝试使用 minicom(在主机 pc 中)和 picocom(在基于 arm 的评估板中)组合传输文件。在评估板方面,我们有/dev/ttygserial,在主机 PC 方面,我们有/dev/ttyUSB0

主机端minicom设置如下,

  1. 串行设备 - /dev/ttyUSB0
  2. 波特率 - 115200

将 minicom 设置为接收模式的步骤。

  1. ctrl+a R,选择zmodem
  2. 现在 minicom 将开始等待来自另一端的文件。

在评估板方面,我们使用 picocom 发送文件如下。

  1. 在命令行执行 picocom -b 115200 -s "sz -vv" /dev/ttygserial
  2. 现在按Ctrl+A and Ctrl+S
  3. Picocom 将通过打印来询问文件名 **file
  4. 提供文件名并按下回车键后,文件将发送到主机。

所有这些步骤都有效,我们能够将不同类型的文件从评估板传输到 PC,但现在我们想将此过程放入 C 代码中。为此,我有以下疑问,

  1. 是否可以minicom使用单个命令设置为文件接收模式?(意思是非交互)?
  2. 是否可以在单个命令中使用 picocom 发送文件(意味着非交互)?
  3. 还有其他建议吗?

serial-port usbserial zmodem

5
推荐指数
1
解决办法
1万
查看次数

标签 统计

zmodem ×2

protocols ×1

serial-port ×1

usbserial ×1