2013-12-10 26 views
2

我有這個地獄,我知道它可能非常簡單。我正在嘗試從我的Seeed GPRS屏蔽閱讀短信。我將屏蔽設置爲軟件串行,並將從GPRS接收的信息顯示到串行監視器。目前我正在處理我的代碼時通過串行發送所有AT命令。要顯示從軟件序列到串行監視器的數據,我正在使用以下代碼。用Arduino從GPRS Shield中讀取長文本

while(GPRS.available()!=0) { 
Serial.write(GPRS.read()); 
} 

GPRS是我的軟件系列顯然。問題是,文本很長,我只能從中得到幾個字符。像這樣的東西。

+ CMGR: 「REC READ」, 「1511」, 「」, 「一十二分之十三/ 09,14:34:54-24」 歡迎到TM eos8

這個文本是一個「歡迎使用T-Mobile」的文本要長得多。顯示的最後幾個字符是混亂的。我已經做了一些研究,並且已經看到我可以將串行緩衝區大小修改爲256而不是默認的64.我想避免這種情況,因爲我確信有更簡單的方法。有任何想法嗎?

回答

0

您是否嘗試讀取字符數組,一次一個字節?看看這有助於:

if (GPRS.available()) { // GPRS talking .. 
    while(GPRS.available()) { // As long as it is talking .. 
    buffer[count++]=GPRS.read();      
    // read char into array 
    if(count == 64) break; // Enough said! 
} 
Serial.write(buffer,count); // Display in Terminal 
clearBufferArray(); 
count = 0; 
} 

,需要相應地聲明變量「緩衝區」和「計數」,並定義函數「clearBufferArray()」

讓我知道,如果這有助於。

0

看起來像這只是在所有Arduino串行連接中缺少流量控制的結果。如果您無法將您的GPRS()輸入字節序列的速率調整爲確保輸入FIFO不能溢出的速率,那麼當輸出FIFO填滿時,您的Serial.write()將會阻塞。此時,您將丟棄新的GPRS輸入字節,直到串行輸出釋放更多空間。

由於所捕獲的輸出被明顯地清理到約64個字節,這表明
a)一種64字節的緩衝器,
b)一種GPRS數據速率比串行一個高得多,並且
c)該垃圾數據實際上是序列中稍後的偶爾有效字節。

您可以通過測試Serial.write的返回碼來確認。如果你回零,那個字節就會丟失。

如果您使用9600的串行和57600的GPRS,我期望有多於64個字節可以在輸出受到損壞之前通過,但是如果GPRS的速率超過串行速率的64倍,則整個輸出FIFO可能會填滿單個輸出字節傳輸時間。

捕獲到中間緩衝區應該可以解決您的問題,只要它足夠大以用於整個消息。同樣,將源(與測試Serial.write一起)或目標(不帶任何附加代碼)FIFO的大小擴展到最大數據報大小應該可以工作。