【STA24】SDカードからログファイル超高速アップロードその0<Teensy4.1とC#で17Mbps出た>

3か月間Pythonばかりいじっていたので、Arduino C++,VisualStudio C#に戻るのに2日間かかりました。
pythonの配列データと型の扱いが超楽ちんなので、いきなりCに戻るとなんて不便なんだとあきれてしまいます。

●高速アップロードの必要性
スキーに取り付けたマイコンログシステムから、一部データは、無線ログしているのですが、全データを無線でログは無理なのでSDカードにログして使ってます。スキー場で、SDカードを取り出す操作はできないので、USBケーブル経由でSDファイルをアップロードして、その場でログデータを解析する機能を開発してます。

●実現方法

①Teensy4.1のSDとUSB超高速を活用する。数十Mbps出ます。
Teensy4.1のUSBシリアルは、実はシリアルではなく、USBの本物通信ですので、数十MBPSでてます。
arduino プログラムでsetupでボーレート指定しても、無視されて、USBの速度12MBPS~480Mbpsでます。

https://www.pjrc.com/teensy/td_serial.html

更に、SDカードの読み書きも超高速です。SPIでなく4bitのSDIOを使ってますので、SPIの4倍速度でます。
だいたい、10Mbps以上は普通にでます。

②USBを高速に受信できるC#を使う
 Pythonでは、あまりにも遅すぎて30分で計測したデータをアップロードするにに30分以上かかってしまいます。
TeraTermでも、バイナリーモニターしながらログすると何分もかかってしまいます。
C#で、メモリーに全データ記憶してから、終わってからログする方式が一番速かったです。

③USBシリアル受信で、スレッド処理を使わないで、シンプルにまとめる方法
DataReceivedHandler(object sender,SerialDataReceivedEventArgs e)
が受信スレッドとして、1バイトも落ちなく受信バッファにため込んでくれるのは良いのですが
ため込んだデータを別のUI用のスレッドで扱えないので、スレッド処理 invoke,delegateでスレッド間の手続きをするのが通常のC#のシリアル受信プログラムですが。
私は、スレッド処理がどうしても理解できないので、使いたくないです。
そこで、C#の抜け穴変数である。public static  byte[] datab=new byte[4000000]と
40Mbyte分のメモリーを静的に確保してしまいました。 この変数は、スレッド間でも
共用できるので、変数の受け渡し無しで、どのスレッドでも使えるので、便利です。

 

gistにコードおいてあります。
https://gist.github.com/dj1711572002/4b33c216dd071169f3eed522c03ca4bc

 

●以後
今回は、高速でアップロードできるかだけの確認しただけなので、実際のプログラムを以後作っていきます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です