2

私はこれに苦しんでおり、おそらく本当に単純であることを知っています。Seeed GPRS シールドからテキスト メッセージを読み取ろうとしています。シールドをソフトウェア シリアルとしてセットアップし、GPRS から受信した情報をシリアル モニタに表示しています。現在、コードの作業中にすべての AT コマンドをシリアル経由で送信しています。ソフトウェア シリアルからシリアル モニタにデータを表示するために、次のコードを使用しています。

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

GPRS は明らかに私のソフトウェア シリアルです。問題は、テキストが長く、数文字しか得られないことです。このようなもの。

+CMGR: "REC READ","1511","","13/12/09,14:34:54-24" TM eos8 へようこそ

このテキストは、はるかに長い「T-Mobile へようこそ」テキストです。表示されている最後の数文字はスクランブルされています。いくつかの調査を行ったところ、シリアル バッファ サイズをデフォルトの 64 ではなく 256 に変更できることがわかりました。もっと簡単な方法があるはずなので、これは避けたいと思います。何か案は?

4

3 に答える 3

0

これは、すべての Arduino シリアル接続でフロー制御が行われていないことが原因のようです。入力 FIFO がオーバーフローしないことを保証するレートまで GPRS() 入力バイト シーケンスのペースを調整できない場合、出力 FIFO がいっぱいになると Serial.write() がブロックされます。その時点で、シリアル出力がより多くのスペースを解放するまで、フロアに新しい GPRS 入力バイトをドロップします。

キャプチャされた出力は明らかに約 64 バイトまでクリーンであるため、これは、a)
64 バイト バッファ、
b) シリアル レートよりもはるかに高い GPRS データ レート、および
c) ガベージ データが実際には後から時折有効なバイトであることを示唆しています。シーケンスで。

これは、Serial.write からの戻りコードをテストすることで確認できます。ゼロが返された場合、そのバイトは失われています。

シリアルに 9600 を使用し、GPRS に 576​​00 を使用している場合、出力が壊れる前に 64 バイトよりもやや多いと予想されますが、GPRS レートがシリアル レートの 64 倍を超える場合、出力 FIFO 全体が 1 秒以内にいっぱいになる可能性があります。単一出力バイトの送信時間。

メッセージ全体に対して十分な大きさである限り、中間バッファーにキャプチャーすると問題が解決するはずです。同様に、ソース (Serial.write のテストと組み合わせて) または宛先 (追加コードなし) のいずれかの FIFO のサイズを最大データグラム サイズに拡張すると、うまくいくはずです。

于 2014-05-12T12:28:11.490 に答える
0

メッセージを読んで64文字を取得しようとして同じ問題が発生しました。GPRS からの読み取りを行う関数を呼び出すループに「delay(10)」を追加することで、これを克服しました。レースシナリオを克服するには十分なようです。- Arduino Mega を使用。

    void loop() {
      ReadmyGPRS();
      delay(10);  //A race condition exists to get the data.  
    }

    void ReadmyGPRS(){
      if (Serial1.available()){ // if data is comming from GPRS serial port
        count = 0;  // reset counter
        while(Serial1.available())          // reading data into char array 
      {
      buffer[count++]=Serial1.read();     // writing data into array
      if(count == 160)break;
     }
     Serial.write(buffer,count);
    }

}

于 2019-10-03T01:53:09.993 に答える
0

一度に 1 バイトずつ、文字配列に読み込もうとしましたか? これが役立つかどうかを確認してください:

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;
}

変数「buffer」と「count」を適切に宣言し、関数「clearBufferArray()」を定義する必要があります

これが役立つかどうか教えてください。

于 2014-01-18T19:42:49.407 に答える