2010-03-28 33 views
0

我正在寫一個程序,從Linux的串口讀取數據。的數據由另一設備使用以下幀格式發送:從C中的幀中提取錯誤的數據?

 

|start | Command | Data    | CRC | End | 
|0x02 | 0x41 | (0-127 octets)  |  | 0x03| 
---------------------------------------------------- 
 

所述數據字段包含如所示出和被字節1,2-包含一種類型的數據的八位位組127;八位組3,4包含另一個數據。我需要獲取這些數據。

因爲在C中,一個字節只能保存一個字符,並且在幀的開始字段中,它是0x02,這意味着STX是3個字符。

因此,爲了測試我的節目,

在發送器側,我構造的陣列如上像格式幀:

 

char frame[254]; 
frame[0] = 0x02; // starting field 
frame[1] = 0x41; // command field which is character 'A' 
..so on.. 
 

並且,然後在接收器側,我走出現如下字段:

 

char result[254]; 
// read data 
read(result); 
printf("command = %c", result[1]); // get the command field of the frame 

// get other field's values 

命令字段值(結果[1])不是字符'A'。

我認爲,這是因爲該幀的第一個字段值是0x02(STX)佔用陣列幀中的3個第一個位置,並導致接收端的錯誤結果。

我該如何糾正這個問題,或者我在發送方做錯了什麼?

相關的問題:
Parse and read data frame in C?
Clear data at serial port in Linux in C?

+1

緩衝區包含什麼?你打電話來執行讀取什麼功能? (這顯然不是一個'read'系統調用。)你是否使用終端應用程序驗證了串行鏈接? – Potatoswatter 2010-03-28 04:14:39

+0

'STX'不佔用3個字節;所有字符需要1個字節。某些字符(如'STX')只有更長的名字。 – Gabe 2010-03-28 05:15:06

+0

read()函數的完整代碼在這裏:http://stackoverflow.com/questions/2500567/parse-and-read-data-frame-in-c。 我也這麼認爲。如果我調用result [1],那麼值應該是0x41,意思是'A',對吧?但事實並非如此。我返回一個奇怪的值。我在想錯嗎? – ipkiss 2010-03-28 09:03:24

回答

0

如果你的程序實際上包含

read(result); 

,那麼你需要添加

#include <unistd.h> 

在頂部,得到函數原型爲read。然後你需要串行端口open並將結果文件描述符與緩衝區一起傳遞給read,這樣它就知道要讀什麼。見man 2 readman 2 open

+0

如果你看看http://stackoverflow.com/questions/2500567/parse-and-read-data-frame-in-c你會發現他的閱讀功能是OK的。 – Gabe 2010-03-28 05:19:12