簡體   English   中英

使用fstream讀取Linux設備

[英]Reading a Linux device with 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似乎沒有返回任何有用的東西。 它的作用就像一個插座。 有沒有什么辦法可以在不知道設備長度,終止和避免內核超時的情況下讀取設備上的所有數據?

使用fstream的問題是fstream有內部緩沖,設備fileOps->read調用和fstream操作之間沒有1:1的相關性。

要與設備驅動程序交互,您確實需要使用unistd.hfcntl.h的低級openreadwrite函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM