2009-12-22 41 views
1

我正在玩XBEE無線電,我使用的是Linux(Ubuntu 9.10),當使用MY代碼時,XBEE似乎沒有通過串行端口發送NULL值。當我使用XCTU程序(附帶在一個單獨的窗口框中XBEE股票長期模擬器),我看到通過串口此輸出時,一個新的XBEE加入網絡:串行端口不發送空值

7E 00 20 95 00 13 A2 00 40 3B 

等..完美。但是,使用我的代碼,當一個新的XBEE加入網絡我看到這一點:

7E 20 95 13 A2 40 3B 

這裏是如何我打開串口

struct termios options; 
int port; 

port = open("/dev/ttyUSB0", O_RDWR | O_NONBLOCK); 
tcgetattr(port, &options); 
bzero(&options, sizeof(options)); 

options.c_cflag = B9600 | ~CRTSCTS | CS8 | CLOCAL | CREAD; 

tcsetattr(port, TCSANOW, &options); 

我有我的代碼做什麼理論,但我的理論顯然是錯誤的。我試圖用9600,8N1,無流量控制打開端口。你可以看到我也在使用serial-> USB驅動程序,但是因爲我似乎獲得了數據,所以我很確定這個部分正在工作。

我的猜測是當我bzero選項,我正在使0x00控制字符?我不確定。當我不選擇bzero選項時,我一次只能讀取5個字節並丟失數據。這感覺就像我有一個流量控制或波特率問題,所以我bzero(),現在我不會得到空值。

我還在我的Linux系統上使用了Minicom並捕獲了輸出。我得到了相同的信息,沒有NULL(這對於那些不熟悉協議的人來說真的會弄亂包大小)。我的代碼是否可以將串口設置爲minicom不變的狀態?我迷路了。

感謝您的幫助!

+0

你清除了'c_cc []'數組嗎?這可能允許空值(和其他控制字符)被傳遞。您是否有一個板載(非USB)串行端口,可用於探測問題不在USB驅動程序中? – 2009-12-22 01:55:47

回答

6

c_cflags的初始化看起來錯了,通過使用按位求反,你基本上設置所有CRTSCTS旁邊:

options.c_cflag = ... | ~CRTSCTS | ...; 

你應該見好就收了CRTSCTS如果該標誌不應設置。

+0

它不僅工作,我的校驗和功能第一次工作!第2步,注意〜操作符。 – ryanday 2009-12-22 02:00:27

0

Digi已經發布了,這是一個ANSI C代碼的開源(MPL 2.0)庫,用於在API模式下與XBee模塊進行通信。它支持POSIX(Linux,BSD,Mac OS X,Cygwin),Windows(MinGW/MSYS),DOS(OpenWatcom)和一些嵌入式平臺。

如果您仍然在Ubuntu中編寫C代碼,可能會感興趣。