NAV-SATデータ受信できたので、SDにログしようとして、昔のプログラムを取り出してコピペしたら OPENエラーで書き込めなくなりました。過去2年散々苦労したのですが、未だにケースバイケースでSDログが 上手くできない状態であることを再認識しました。
●過去のSDログのトラブル
①Hardwareシリアルのバッファサイズの設定でsdFat.hがコンフリクトを起こす。
=>前回は、【STA22】Teensy4.1SDカードOPENエラー<HardwareSerialバッファが原因だった>
前回は、1回100バイトのシリアル受信を端折って、3回分300バイトのバッファにして読もうとしたら エラーがでた。毎回100バイトずつコマ目に読んでいれば正常だった。 という原因でした。 =>何故いけないのかは、憶測ですが、シリアルバッファ周辺のメモリー管理が動的なので一回受信した状態と何回もため込んだ状態で、メモリーの管理が違ってしまって、他の領域とぶつかるのではないかと思います。 WEBでも似たような現象を訴えている人がいますが、有効な対策は提示されてませんので、各自工夫する以外にないです。 基本的には、どんな場合でも必ず受信できる設計がされているので、ケースバイケースでプログラムを組みなさいということです。
●ArduinoIDEは最新の2.34は、sdFatがエラーでるので、ArduinoIDE 1.816まで戻しました。
ArduinoIDE 2xxx系では、未だ、ライブラリーが対応してない物が多いので、当面は、昔のArduinoIDE1.816でいきます。
●今回のOPENエラー現象
hardwareSerialを使ってない場合は、正常に動作しますが、一旦使いだすとOPENエラーとなってファイルが登録できません。 設定条件は、1024byteと巨大なバッファを確保していました。
uint8_t serialbuffer4[1024]; Serial4.begin(115200); Serial4.addMemoryForRead(serialbuffer4, sizeof(serialbuffer4)); |
バッファサイズを728へ減らすと動作しだしました。
しかし、NAV-SATが400-800バイトあるので、1024は必要なのですが、728バイトでどうなるか実験しました
●バッファサイズがデータ長より短い場合の動作
短い場合while(Serial.available()>0{読み取り}では、全部よんでもF9Pから送られてきたデータ全部ではない場合があります。 バッファは、リングバッファなので、短くても最終バイトが終われば次の受信データは、最初のバッファにためこみます。 受信のタイミングによって場合分けで考えます。 Aモード:F9Pからの200~1000個のデータが切れ目なく受信できた場合は、while{}からでることなく、全部データ配列に収納されます。 Bモード:F9Pからの100~データが途切れ途切れに来た場合は、while{}から一端でて、次のwhile{}で続きを読みます。 この場合は、F9Pからの1周期(1エポック)が途中で途切れて配列に収納されます。 =>Bの対策として、受信したてのデータ配列をそのままSDに書き込んでしまいます。 そうすることによって、データの欠落は無いけど、ヘッダが先頭にこないので後でヘッダを探す作業と、衛星補足データのメッセージ長を計算して、データを検索する作業がありますが、これは、PC上で後処理で行います。 Aモード場合は、1エポックで得られたデータ配列をそのまま、ヘッダを探してメッセージ解釈すればデータとして再現できるので モニター用のデータとなります。
●モニター用のデータ抽出
SDには、全データ収納されているので、SDから読み込んで検索計算すれば完全に解読できるのですが、 書き込み中のファイルを読むと数十msec時間をロスして、生データを欠落させてしまうので、全データモニターはあきらめて NAV-PVTとNAV-SATが完全なデータだけを抽出してモニター計算することにしました 抽出方法:numSVが判れば、総データ数=100+(numSV*12+14)+72 でわかります。最低でも100+(numSV*12+14)バイトの データがあるエポックなら衛星補足状態とRTKの主要パラメータがえられます。Baseなので、relPosNEDは、基準局からの 距離精度を見る時しか使いませんので、スキー場の現場では不要です この方法でプログラムした出力の解説 ●SDログしたデータ バイナリエディタで眺めてみました。ファイルの最初は出鱈目な順番で始まってますが、ヘッダを検索していけば RELPOSNEDがでてきて、72バイト先にPVTがあって、100バイト先にSATがあって、SATが不定サイズですが、計算すると 170バイトなのでその辺を探すとRELPOSNEDがあるので、この順でバイナリログされてのが判ります。 これをPCで読んで各種処理をします。
●プログラム
https://gist.github.com/dj1711572002/725475ce52caea135b696e2a561f3744
注1: SDのCLOSE OPENの間は、10-20msecDelayがないとハングします。 注2:SD書き込みでも、直上にif(!myFileB)とOPEN状態を確認してから書き込まないといけません。
//=================SD LOG=========================== delay(5); if(!myFile) { Serial.printf(“=============myFile open Error============%d\n\r”,dcount); c=2; //exit(0); } else { //Serial.println(“==============myFile Write Successed=========”); for(i=0;i<dN;i++) { if(myFile){ myFile.write(dBuf4[i]); } } c=0; }//SD LOG END |
デバッグ基板は、板の上に載せて、 ハブでPCと接続します
抜き差しを避けるためにHUBのボタンで電源オンオフします。
F9Pは常に電源をいれておかないと一端おとすと数分のfloat待ちになります。
デバッグが数十回になるので、デバッグ基板セットを作っておくことが重要です、