前回までの調査をもとに、とりあえずコンソール画面で制御ができるところまで可能になった。ただ、ファイル転送については、誤り検出用のデータ生成方法がわからず、未解決のまま。
ファイル転送について分かった部分のみ記載。
転送方法
フロー
- PC側からM28コマンドを送付し機器側からOKを待つ。
- 転送するファイルを4096バイトに分割し送付する。
4096バイトの送付毎に、機器側から問題なく転送できたかどうかの返却が来る。 - 全データ送付後、PC側からM29コマンドを送付し、ファイル転送処理は完了する。
M28コマンドの内容
M28□ファイルサイズ□ファイル名
ファイル名は、機器側の保存先になるようで、0:/user/~.gのような形になっていた。0:/user/が機器側での保存フォルダなのだろう。
なお、□は半角スペースを表している。
ファイルの分割転送
ファイルを4096バイト単位で分割し、それにヘッダー16バイトをつけて転送する。転送後、その転送が成功したか失敗したか機器側から返答が来る。
M29コマンドの内容
M29のみ送付する。
ヘッダー情報
ファイルの分割転送時、16バイトのヘッダーを付ける。その内容は以下の通りだった。
0~3バイト | 5a 5a a5 a5 上記固定の4バイト |
4~7バイト | 転送したブロックのシーケンス番号 0オリジンでビッグエンディアンで格納 |
8~11バイト | 転送するデータのバイト数をビッグエンディアンで格納 |
12~15バイト | 転送するデータの誤り検出情報 |
誤り検出情報
一応、32ビットのようなので、そのようなデータを出力するアルゴリズムを一通り試したが結果が一致しなかった。
試したのは、CRC-32、CRC-32C、Adler32, Fletcher Checksum。
一応、一番簡単なデータでの結果は、以下の通り。
データ | 誤り検出情報 |
47 31 | af 3f cb 07 |
まとめ
誤り検出情報のアルゴリズムさえわかれば、通信のライブラリクラスは完了するのだが。
そうすれば、GUIの構築と、Z軸位置精度の向上とか、ブリムの定着性向上とかのファイルプリ処理を組み込めるのだが。
ここら辺、プログラムを分けてしまうかな。
コメント