使用fstream读取Linux设备

时间:2011-05-19 21:06:21

标签: c++ usb linux-device-driver fstream

我试图从通过USB TMC和SCPI使用的某些硬件获得反馈。我可以在C ++ [io] fstream中使用/dev/usbtmc0读取和写入设备,通过读写交替发送和接收消息。大多数命令都由一个换行符终止,因此很容易判断何时收到响应结束。我正在使用的简化代码是:

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似乎没有返回任何有用的东西。它的作用就像一个插座。有没有什么方法可以在不知道其长度,终止和避免内核超时的情况下读取设备上的所有数据?

1 个答案:

答案 0 :(得分:2)

使用fstream的问题是fstream有内部缓冲,设备fileOps->read调用和fstream操作之间没有1:1的相关性。

要与设备驱动程序进行交互,您确实需要使用openread中的低级writeunistd.hfcntl.h函数。< / p>