使用Linux和C通过串口发送文件

3
我正在开发一个应用程序,它可以从串口读取数据并通过TCP连接发送数据,反之亦然。不幸的是,在读取串口数据时,它永远不会停止。它无法检测到EOF标记,也无法检测到EOL或其他特殊字符。
那么,在C和Linux中,如何检测串口的文件结束(或“连接结束”)呢?

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

6
取决于您对串行链接协议的控制程度。除非文件隐含地包含某些文件结束标记(根据我对您的帖子的理解,它们没有),否则您需要实现某种通信协议以传输文件。在BBS时代使用的一些最简单的协议之一是XMODEM及其衍生协议,它们可能足够简单,适合您使用。如果您在串行线的另一端有一个完整的计算机,则只需在串行线上设置PPP链接,并通过TCP/IP进行通信可能会更简单。

2
串行链路只能发送字节,没有数据包帧和错误检查,因此无法通过原始串行链路可靠地发送文件。您需要使用一些协议,如XMODEM、KERMIT等。
实现这样的协议并不是简单的事情。如果另一端也是计算机,可能更容易在链路上运行TCP/IP。请查看SLIPPPP

1
串口在挂断条件下会发出“文件结束”信号,这是由调制解调器控制线(DCD)的带外信号发出的。如果您使用的是空模拟电缆连接,那么这种情况永远不会发生。
像其他答案建议的那样,使用一种框架机制。如果链接相对无误且8位清洁,则您可能不需要像ZMODEM那样完全处理 - 只需在文件前加上文件大小和CRC32校验和即可。

0

简单粗暴的解决方案: 在Linux、Unix或OSX上,只需运行“screen -L <serial_device> <baudrate>”即可。在另一端,以原始模式将文件输出到控制台。-L将其记录到一个文件中,其内容将是从另一端传输的文件。使用xxd检查内容以验证它们与源文件匹配。


0

检查您的串口配置:

stty -F /dev/ttySx -a

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

stty -F /dev/ttySx cooked

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接