Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何确定linux串行端口上剩余的写/输出缓冲区空间量?_C_Linux_Serial Port_Buffer_Ioctl - Fatal编程技术网

C 如何确定linux串行端口上剩余的写/输出缓冲区空间量?

C 如何确定linux串行端口上剩余的写/输出缓冲区空间量?,c,linux,serial-port,buffer,ioctl,C,Linux,Serial Port,Buffer,Ioctl,您可以使用ioctl确定在linux下可以从串行端口读取多少数据。在向串行端口写入数据时,是否可以确定其剩余的缓冲区空间?实际上,我想将一块数据写入一个串行端口,只有当它可以一次性卸载时才成功,或者如果它必须被分块,则失败。对端口的写入和读取是非阻塞的。我不希望它是UART缓冲区,但是内核内存缓冲区在UART缓冲区之前(我猜)。串行端口是字符设备而不是块设备。它没有缓冲区。 字符设备(如串口、键盘、鼠标)只写和读字符,而不是单词。 例如,如果你听一个连载某人写的“祝你有一个愉快的一天”,如果你从

您可以使用ioctl确定在linux下可以从串行端口读取多少数据。在向串行端口写入数据时,是否可以确定其剩余的缓冲区空间?实际上,我想将一块数据写入一个串行端口,只有当它可以一次性卸载时才成功,或者如果它必须被分块,则失败。对端口的写入和读取是非阻塞的。我不希望它是UART缓冲区,但是内核内存缓冲区在UART缓冲区之前(我猜)。

串行端口是字符设备而不是块设备。它没有缓冲区。 字符设备(如串口、键盘、鼠标)只写和读字符,而不是单词。
例如,如果你听一个连载某人写的“祝你有一个愉快的一天”,如果你从他开始打字时就不听,你就看不到整个短语。如果您使用文件描述符访问串行端口,则在侦听时只能看到键入的字符,只要描述符准备好进行非阻塞写入,就可以使用
select
进行检查。我不知道这对串口什么时候起作用。我将其用于TCP套接字,它起了作用。

您可以确定写入/输出量

全文如下:

ioctl(device_handler, TIOCINQ, &bytes);
对于写入:

ioctl(device_handler, TIOCOUTQ, &bytes);
FIFO缓冲区的大小:

serial_struct serinfo;
memset(&serinfo, 0, sizeof(serinfo));
ioctl(device_handler, TIOCGSERIAL, &serinfo);
serinfo.xmit_fifo_size;
问候,,
VA.

我怀疑这取决于硬件tx/rx FIFO大小,它是由内核从您那里抽象出来的。。。但是,当它对硬件来说太多时,内核是否只是将其保存在内部缓冲区中?这我不知道。这就是我所期望的,所以内核内部缓冲区一定有一些上限。这是我期望能够检索到的边界。可能值得重新评估问题定义并考虑其他设计选项。也许异步IO方案会更好。或者
open
w/
O_NONBLOCK
,查找
EAGAIN
。实际上,我正在尝试复制send()为套接字提供的功能,也就是说,它要么全去,要么全不去。我将物理传输从应用程序的其余部分抽象出来。整个系统已经是非阻塞的,所以我知道写操作不会阻塞,我只是不知道它是否会将我想要的所有数据卸载到内核空间。好吧,那么试试
O_NONBLOCK
。但是肯定有一些缓冲在里面?至少有UART FIFO。FIONREAD ioctl在看什么缓冲区?是的,有缓冲,但据我所知,它只能在内核模式下访问。您必须在内核中加载一个模块,才能侦听设备驱动。奇怪的是,我可以通过FIONREAD ioctl找到读取的内核模式缓冲大小,但写入没有并行功能-我曾将其用于套接字,但我不知道它适用于任何设备。
serial\u struct
需要改为
struct serial\u icounter\u struct