Linux 串口:无法写入大数据块

Linux 串口:无法写入大数据块,linux,serial-port,Linux,Serial Port,我正在尝试使用串行电缆将文本数据从一台电脑发送到另一台电脑。其中一台电脑正在运行linux,我正在使用write(2)系统调用从它发送数据。日志大小约为65K字节,但write(2)系统调用返回约4K字节(即传输的数据量)。我尝试将数据分成4K块,但write(2)返回-1 我的问题是“在串行端口上写入数据有缓冲区限制吗?或者我可以发送任意大小的数据吗?在写入4K数据块时,我是否需要从其他PC连续读取数据?” 我是否需要在termios结构中进行任何特殊配置以发送(巨大)数据?传输缓冲区为一页(

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

我的问题是“在串行端口上写入数据有缓冲区限制吗?或者我可以发送任意大小的数据吗?在写入4K数据块时,我是否需要从其他PC连续读取数据?”


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

传输缓冲区为一页(查看Linux 2.6.18源代码)-在大多数(如果不是所有)情况下为4K


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

是的,存在缓冲区限制-但当达到该限制时,
write()
应该会阻塞


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

确保接收器正在读取

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

如果在后续写入时返回错误。从manpage判断,可以安全地重试以下错误号的写入:EAGAIN、EINTR和ENOSPC。使用perror()查看您得到了什么。(…我很好奇,把它贴出来。)

EFBIG似乎表示您试图使用的缓冲区(或者更确切地说是计数)太大,但可能比64k大得多

如果内部缓冲区已满,因为正在快速写入,请尝试在写入之间(nano)休眠一点。有几种聪明的方法可以做到这一点(就像tcp),但是如果速率已知,就以固定速率写入


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

发布以4K块写入数据的代码片段对您来说容易吗?“UNIX环境中的高级编程”由W.Richard Stevens(实际上是他的任何一本书)撰写,如果您要做任何重要的事情,都是必读的。