用fstream读取Linux设备

| 我正在尝试从USB TMC和SCPI上使用的某些硬件获得反馈。我可以在C ++流中使用ѭ0来读写设备,交替进行读写以发送和接收消息。大多数命令都由一个换行符终止,因此很容易知道何时收到响应结束。我为此使用的简化代码是:
fstream usb;
usb.open(\"/dev/usbtmc0\", fstream::in);
if (usb.good())
{
    string output;
    getline(usb, output);
    usb.close();
    // do things with output
}
// additional cleanup code...
但是,有一件事情让我逃脱了,它在SCPI / IEEE规范中定义为\“ * LRN?\”。发送后,连接的设备将发回任意数据(规范中的实际措词),如果设备进入怪异状态,可用于以后对设备进行重新编程。 此LRN命令的响应消息的问题在于它包含一个或多个换行符。它确实以换行符正确地终止了整个消息,但是嵌入了换行符这一事实使得使用它确实很棘手。有些硬件会为有效负载加上长度前缀,而有些则不会。 从硬件读取数据时,Linux usbtmc内核驱动程序内置了5秒钟的超时时间,如果您尝试读取所有可用数据,它将阻止所有读取调用。使用fstream :: eof似乎没有返回任何有用的信息。它的行为很像套接字。有什么方法可以读取设备上的所有数据,而无需知道其长度,终止以及避免内核超时?     
已邀请:
为此使用
fstream
的问题是
fstream
具有内部缓冲,设备
fileOps->read
调用和
fstream
操作之间没有1:1的关联。 为了与设备驱动程序进行交互,您确实需要使用
unistd.h
fcntl.h
中的低级
open
read
write
函数。     

要回复问题请先登录注册