0

この情報はどこにも見つかりませんでした。redpark ケーブルの TTL バージョンで文字列を送信できる時間はどれくらいですか?

次のデリゲート メソッドは、Arduino から完全なシリアルを出力するときに 2 回呼び出されます。文字列の例は次のとおりです: 144;480,42;532,40;20e

- (void) readBytesAvailable:(UInt32)length{

利用可能なデータを取得する新しい関数メソッド [getStringFromBytesAvailable] を使用すると、144;480,42;532,40; しか取得できません。次に、関数全体が再度呼び出され、文字列に残りの文字列が含まれるようになりました: 20e

次の方法は、2 つの文字列を追加するために機能しますが、データ転送速度が「遅い」場合のみです (1 秒に 1 回、1 秒に 10 回以上をお勧めします)。

-

 (void) readBytesAvailable:(UInt32)length{

    if(string && [string rangeOfString:@"e"].location == NSNotFound){
        string = [string stringByAppendingString:[rscMgr getStringFromBytesAvailable]];
        NSLog(string);
        finishedReading = YES;
    }
    else{
        string = [rscMgr getStringFromBytesAvailable];

    }


    if (finishedReading == YES) 
     {

        //do stuff

     }
        finishedReading = NO;
        string = nil;
    }

}

しかし、「長い」文字列を記述した場合にメソッドが 2 回呼び出される理由と、この問題を回避する方法を教えてください。

4

3 に答える 3

0

プログラムフラグメントは文字列の送信にかかる時間よりも高速に実行されるため、バイトをキャプチャして文字列に追加する必要があります。

シリアルデータがキャリッジリターンで終了している場合は、文字列全体を受信したことを確認するためにテストできます。

次に、Arduinoが1秒間に10回送信できるようにします。

于 2012-09-23T03:05:42.307 に答える
0

実際、RedPark が提供する redparkSerial ヘッダー ファイル内の serialPortConfig を使用すると、想像以上に構成を制御できます。readBytesAvailable:length メソッドは抽象化されており、次の 2 つの条件のいずれかが満たされた場合にのみ呼び出されます: プライマリ バッファー内のデータで rxForwardingTimeout 値を超えるか (デフォルトは 100 ミリ秒に設定)、または rxForwardCount に達します (デフォルトは 16 文字に設定)。

したがって、あなたの場合、最初の読み取りの後、まだバッファにデータがあるように見えます。つまり、残りのデータを取得するために、(メインの実行ループから) readBytesAvailable:length メソッドが再度呼び出されます。期待どおりに動作するまで、rxForwardingTimeout と rxForwardCount を試してみることをお勧めします。

ただし、既に述べたように、識別のために、少なくともパケットの最後にフラグ (キャリッジ リターンである必要はありません) を追加することをお勧めします。

また、ここにいくつかの良いアドバイスがあります:組み込みシステム用のシリアル コマンド プロトコルをどのように設計しますか?

幸運を!

于 2012-12-19T02:05:36.467 に答える
0

それがシリアルポートの仕組みです。これらの問題を回避することはできませんし、回避する必要もありません。SW/HW のどのレベルでも、シリアル データ ストリームをそのまま維持しようとする試みはありません。シリアル データは単なるバイト ストリームであり、パケット化の概念はありません。そのため、部分的なデータを読み取って残りを後で読み取る必要があるという事実に対処する必要があります。

于 2012-09-21T14:36:00.303 に答える