2012-12-30 17 views
0

我想從安裝爲Linux板上的ttyHS4(控制)和ttyHS5(數據)的選項調制解調器獲取RSSI值。預期的結果顯示在控制檯上,但fgets僅捕獲任何控制檯輸出數據。fgets無法捕獲來自tty設備的輸出

if ((f=popen("echo -e \"AT+CSQ\r\n\">dev\ttyHS4","r"))==NULL){ 
perror("popen"); 
exit(1); 
} 

while (fgets(buff,sizeof(buff),f){ 
printf(":%s:\n",buff); 
} 

我使用popen命令中的「echo \」TEST \「」進行了測試,上面的代碼能夠打印出「:TEST:」字符串。使用ttyHS4輸出,我只能在控制檯上獲得一些輸出,但fgets + fprintf不能獲取任何數據。

請告訴我可能發生故障的位置。

+0

刪除'「\ r」' –

+0

並在路徑前加一個'/' –

+0

您的意思是\ r \ n \用於AT + CSQ?請記住,我能夠獲得RSSI和BER值,即。 + CSQ:16,99。問題只有在Linux控制檯上,而不是通過C程序中的fgets。無論如何 - 我試過了,刪除了\ r - 這次完全沒有結果。 – user1108249

回答

1

要調用popen()創建一個文件描述符渠道主程序標準輸出該命令:

echo -e ... >/dev/ttyHS4 

意識到這個命令沒有發送任何文件描述符,對吧? popen()打開一個shell - 通常爲/bin/sh - 然後然後執行該命令。由於重定向到/dev/ttyHS4echo命令不會將其標準輸出發送到與其父shell相同的文件描述符,這導致沒有任何內容被寫入f - 即使這不是問題,echo也不會回讀調制解調器響應你..

那爲什麼你甚至使用popen()echo,而不是隻打開/dev/ttyHS4讀/寫,並使用直接產生的文件描述符read()write()

+0

謝謝。一個linux新手誤操作,因爲我可以讓ttyHS4在迴應AT命令後打印回控制檯,我預計fgets將能夠捕獲來自ttyHS4的響應。我現在正在使用write()和read(),並在字符串解析地獄階段...謝謝你的提醒。 – user1108249

0

在路徑中有一個製表符是非常不尋常的。你大概的意思做:

popen("echo \"AT+CSQ\">/dev/ttyHS4","r") 
+0

示例來自Option Wireless驅動程序手冊 - #echo -e「 \ r \ n」>/dev/ttyHSx – user1108249

+0

我只是想知道爲什麼我可以在執行C程序時將正確的結果發送到控制檯代碼,但fgets根本不捕獲任何東西。謝謝。 – user1108249

相關問題