【问题标题】:Send file over serial port with Linux and C使用 Linux 和 C 通过串口发送文件
【发布时间】:2012-10-03 04:27:48
【问题描述】:

我正在开发一个从串行端口读取数据并通过 TCP 连接发送数据的应用程序,反之亦然。不幸的是,在从串口读取数据时,它永远不会停止。它不检测 EOF 标记,也不检测 EOL 或其他一些特殊字符。

那么,我如何在 C 和 Linux 中通过串行端口检测文件结束(或“连接结束”)?

【问题讨论】:

  • 您对连接到串口的设备有多少控制权? TCP 套接字另一端的设备呢?
  • 如何决定何时将数据写入 TCP 套接字?也就是说,您是在通过套接字传输之前尝试接收整个数据集,还是从套接字读取数据并立即(或稍微缓冲)将其写入套接字?

标签: c linux serial-port


【解决方案1】:

取决于您对用于串行链路的协议的控制程度。除非文件隐式包含一些文件结束标记(据我了解,它们没有),否则您需要实现某种通信协议才能传输文件。

在 BBS 时代使用的一些最简单的协议是 XMODEM 及其派生词。它们可能很简单,您可以使用。

如果您在串行线路的另一端有一台功能齐全的计算机,那么在串行线路上建立一个 PPP 链接并通过 TCP/IP 进行通信可能会简单得多。

【讨论】:

    【解决方案2】:

    串行链接只发送字节。没有数据包帧,没有错误检查,因此您无法通过原始串行链路可靠地发送文件。您需要使用一些协议,如 XMODEM、KERMIT 等。

    实现这样的协议并非易事。如果另一端也是计算机,则在链路上运行 TCP/IP 可能更容易。请查看SLIPPPP

    【讨论】:

      【解决方案3】:

      串行端口在挂断条件下给出“文件结尾”,调制解调器控制线在带外发出信号(丢弃DCD)。如果您连接的是 null-modem,则永远不会发生这种情况。

      使用框架机制,就像其他答案所建议的那样。不过,您可能不需要像 ZMODEM 这样的东西全力以赴 - 只要在您的文件前面加上文件大小和 CRC32 校验和就可以了,如果链接相当无错误且 8 位干净。

      【讨论】:

        【解决方案4】:

        检查你的串口配置:

        stty -F /dev/ttySx -a
        

        设置熟链接而不是原始链接:

        stty -F /dev/ttySx cooked
        

        【讨论】:

          【解决方案5】:

          廉价而肮脏的解决方案: 在 linux、unix 或 osx 上只需运行“screen -L ”。在另一端,以原始模式将文件的输出写入控制台。 -L 将其记录到一个文件中,该文件的内容将是您从另一端传输的文件。使用 xxd 检查内容以验证它们是否与您在源中的内容相符。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-09-12
            • 1970-01-01
            • 1970-01-01
            • 2011-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多