2014-10-04 63 views
0

我有一個設備,/ dev/ACMTTY0它流數據;或者說,現在,隨機整數0 - 100.從串行設備讀取數據到數組C++

設備/ dev/ACMTTY0不斷流。但是,我仍然不知道如何將串行數據流讀取到C++中的數組中 (正確)現在,我試圖將它發送到屏幕,以便我可以看到發生了什麼。 當我運行我的程序時,發生了什麼事情,我得到一些可能有效的數字,我得到一些-1,然後程序退出,隨機點。我打算在EOF退出,但在此之前退出? EOF適合流式傳輸嗎?

sudo ./getc /dev/ttyACM0 
53 
50 
10 
56 
-1 
-1 

任何如何,我不應該得到-1有史以來,所以我不知道那是關於什麼。 此外,數字仍然是流媒體。所以我不明白爲什麼程序退出。 對於更奇怪的行爲,該程序可能會流出數百個號碼,然後退出,或者可能會流2.請參閱

有沒有什麼我在這裏做錯了:?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <inttypes.h> 
#include <iostream> 
int main (int argc, char ** argv) 
{ 
using namespace std; 

FILE * pFile = NULL; 
int c = 0; 
pFile = fopen(argv[1], "r"); 
    // pFile=fopen ("fake.dat","r"); 
     if (!(pFile = fopen(argv[1], "r"))) { 
     std::cout << argv[1] << " Couldn't open serial port for communication.\n"; 
     exit(EXIT_FAILURE); 
     } 

    if (pFile == NULL) perror ("Error opening file"); 
    else 
    { 
    do { 
     c = getc (pFile); 
     std::cout << c << "\n"; 
    } while (c != EOF); 
    fclose (pFile); 
    std::cout << c << "\n"; 
//sleep(2); 
     } 
    return 0; 
} 

我可以讀取我的假數據(文件)就好。

+0

你需要通過編寫代碼來啓動。如果您使用該代碼提出具體問題,請將其發佈到此處。 – 2014-10-04 13:35:29

+0

除了其他任何事情,你的協議沒有被充分指定。漂浮在什麼格式?我懷疑是ASCII文本表示法,但這並不明確。打開設備並嘗試讀取它,即。按照@JohnZwinck的建議編寫一些代碼。 – 2014-10-04 13:51:50

+2

「有爭議」還是「連續」? – 2014-10-06 16:54:11

回答

1

您像讀取文件一樣讀取設備並解析它。讓我們假設流雲:

$ 1,2,3,4 ... $ 4,5,6,7

其中$是你的標記字符。除非你看到$,否則你不能做任何事情,所以只需放棄任何前導數字。然後你會反覆尋找下一個逗號,將數字和atoi去掉。當然,你會在$時將你的熱電偶號碼重置爲零,並在每個逗號處增加它。如果你幸運的話,atoi不會抱怨這些逗號,所以你甚至不需要在將數字複製到其他地方之前將它們複製到其他地方,但我不確定這一點。

+0

我看着它。 – j0h 2014-10-04 14:28:28

+0

'strtol'而不是'atoi' ...工作並告訴你什麼字符標記了數字的結尾。 – 2014-10-06 16:54:44

0

在C/C++中,讀取-1 的字符是的EOF(通常)。如果/ dev/device正在返回EOF,則意味着沒有更多數據可供讀取(設備尚未生成它)。這兩個「-1」 S在你的輸出結束時發生在這裏:

do { 
    c = getc (pFile); 
    std::cout << c << "\n"; 
} while (c != EOF); 
fclose (pFile); 
std::cout << c << "\n"; 

當遇到EOF,其輸出一次,然後循環中斷,則該文件被關閉,那麼EOF是在程序結束之前再次輸出。這是你的兩個「-1」的來源。

如果你不想輸出「-1」 S,這裏是如何修改這個代碼片段:

c = getc(pFile);  //read before entering the loop 
while (c != EOF) { //compare before loop, rather than after 
    std::cout << c << '\n'; 
    c = getc(pFile); 
} 
fclose(pFile);