2013-11-20 93 views
2

我有一個嵌入式Linux盒子,附帶5.10和GSM調制解調器。 我寫了一個簡單的perl腳本來通過調制解調器設備文件(/ dev/ttyACM0)讀/寫AT命令。使用Perl發送AT命令到調制解調器

如果我在調制解調器上寫入類似「ATZ \ r」的simle命令並等待響應,我會收到非常奇怪的數據,如「\ n \ n \ nATZ \ n \ n0 \ n \ nOK \ n \ n \ n \ n \ nATZ \ n \ n \ n \ n ...「並且數據不斷傳入。它似乎與其他數據混淆在一起。

我希望看到類似「ATZ \ nOK \ n」(如果啓用了回顯)的內容。

如果我用例如手動發送「ATZ」命令, minicom一切都按預期工作。

這使我認爲它可能是某種perl緩衝問題,但這只是猜測。

我喜歡這個perl的打開裝置(我沒有設備的serialport ::我的嵌入式linux perl安裝):



    open(FH, "+<", "/dev/ttyACM0") or die "Failed to open com port $comport"; 

,並在有時間讀取響應一個字節:



    while(1) { 
     my $response; 
     read(FH, $response, 1); 
     printf("hex response '0x%02X'\n", ord $response); 
    } 

我錯過了一些初始化或其他東西來得到這個權利?

問候 克勞斯

回答

0

謝謝您的回答。雖然不是我的問題的明確答案,但它確實使我走上了正確的軌道。

正如mti2935所指出的那樣,這確實不是一個perl問題,而僅僅是一個tty配置問題。

使用「stty的」命令使用以下參數設置我的串口在「預期」模式:

  • -opost:禁用所有輸出後處理
  • -crnl:不要翻譯CR爲NL
  • -onlcr將:不要NL沒有轉化爲CR NL
  • -echo:不迴應輸入(已啓用此回聲和回聲的調制解調器本身給我造成古怪的行爲在我的劇本雙回聲)

也可以使用組合設置「raw」以正確的方式設置所有這些參數。

-

2

我不認爲你需要的while循環。此代碼應發送ATZ命令,等待響應,然後打印響應:

open(FH, "+>", "/dev/ttyACM0") or die "Failed to open com port $comport"; 
print FH ("ATZ\n"); 
$R = <FH>; 
print $R; 
close(FH); 
+0

試過同時與讀入行,但不幸沒有改變接收到的數據。 –

+0

您可以嘗試使用終端仿真程序連接到設備(例如屏幕,請參閱http://www.cyberciti.biz/faq/unix-linux-apple-osx-bsd-screen-set-baud-rate/)並執行ATZ命令,並查看響應是什麼?我懷疑這可能不是一個perl問題,但是設備的輸出可能與您所期望的不同。或者,也許使用錯誤的通信設置(波特率,奇偶校驗,停止位等)。這個測試將有助於隔離問題。 – mti2935

2

這可能與截斷有關。嘗試將「+>」更改爲「+ <」。

或者,它可能是與緩衝,儘量unbuffering輸出後您的open():

select((select(FH), $| = 1)[0]); 
+0

我的錯誤,「+ <」實際上就是我所做的。我錯誤地抄襲了我的帖子。現在已經在我的文章中修復了。 –

+0

不幸的是沒有工作。同樣的結果 –

相關問題