串口:无法写入大块数据

时间:2010-03-10 06:59:22

标签: linux serial-port

我正在尝试使用串行电缆将文本数据从一台PC发送到另一台PC。其中一台PC正在运行linux,我正在使用write(2)系统调用从中发送数据。日志大小约为65K字节,但write(2)系统调用返回一些4K字节(即正在传输大量数据)。我尝试以4K块的形式分解数据,但是write(2)返回-1。

我的问题是“在串口上写数据是否有任何缓冲限制?或者我可以发送任何大小的数据吗?我还需要在写入4K数据时继续从其他PC读取数据”< / p>

我是否需要在termios结构中进行任何特殊配置以发送(大量)数据?

3 个答案:

答案 0 :(得分:1)

发送缓冲区是一页(看看Linux 2.6.18源代码) - 在大多数(如果不是全部)情况下都是4K。

另一端必须读取(不知道接收缓冲区的大小),但更重要的是你不应该写出比串口可以传输更快的速度,如果你使用115200 bps 8-N-1你可以写4K大块每秒大约3次。 (115200/9/4096 = 3.125)

答案 1 :(得分:1)

是的,有一个缓冲区限制 - 但是当你达到这个限制时,write()应该阻止。

write()返回-1时,errno设置为什么?

答案 2 :(得分:0)

确保接收器正在读取。

您应该从write()更新缓冲区的当前位置,并从那里继续下一次写入。 (适用于所有的write(),无论fd是串口,tcp套接字还是文件。)

如果您在后续写入时收到错误消息。根据联机帮助页,可以安全地重试以下错误的写入:EAGAIN,EINTR和可能的ENOSPC。使用perror()来查看你得到的内容。 (..并发布,我很好奇。)

EFBIG似乎表明您正在尝试使用过大的缓冲区(或者更确切地说)来编写,但这可能远大于64k。

如果内部缓冲区已满,因为您正在快速写入,请尝试在写入之间稍微休眠(纳米)。有几种聪明的方法可以做到这一点(比如tcp),但如果速率已知,则只需以固定速率写入。

如果您认为接收器实际上正在读取,但没有太多发生,请查看串行端口流量控制选项以及是否为DTS / RTS连接电缆。