こんにちは。3回目です。
今回は、以前公開したR8C書き込み用プログラムを、Windowsに対応させたのでその報告を。でも、これから更新するたびにここに新しく投稿するのもどうかと思うので、こんなのを用意したので、小さな変更しか無い更新はこれからはブログには書かないかな。
さて、今回の更新は、シリアルポート周りのWindowsではどうにも動かない(Cygwinとか除く)コードの隣に、WindowsAPIを使ったコードをマクロでスイッチするように書き足して、動くようにしたというのが大体の内容です。(ただし、VC++ではなく、MinGWなどを使うこと)
多くの、コンパイラを持たないWindowsユーザーのためにコンパイル済みのバイナリも一緒に入れました。さらに、前回tar.xzだけだったものを、zipでも配布します。ので、今回公開のファイルは、
r8c-writer_0.2.tar.xz (48412B, MD5:b47b02419e6a1b2fa57d0725a8cde071)
r8c-writer_0.2.zip (55786B, MD5:ae5736b937624d808ff175ffc6221547)
の2つです。中身はおんなじ。
WindowsのAPIいじるのなんて数年ぶりで、しかもCOMポートは触ったことがなかったので、だいぶ苦労しました。主にタイムアウトの件で。ほとんど書き終わってから、COMポートでは(他のファイルハンドルとは違い)読み書きのタイムアウトを設定できることを知り、愕然としました。で、書き直すのが面倒でその機能を使わないコードのままにしたので、ちょっと効率の悪いコードになっております。リファレンスが読みづらいのが悪い。
そういえば、途中で気づいたことを書いときます。
- IDチェック機能は、一回チェックを通れば、電源を切るまで再びのチェックは必要ないようになっている
- フラッシュへの書き込みなどでのビジー状態を示すためのステータスフラグがあるので、書き込み中でもそのフラグの読み込み要求にはさっと答えてくれるかと思ったらそんなことはなかった。(つまり、こちらからの命令の応答は、だいぶ遅れることがある。このため、タイムアウト時間は1秒以上くらいとっておかないといけない)
- フラッシュメモリのブロックサイズとかブロック境界はマイコンによって違うのに、シリアルプロトコルでは接続しているマイコンを確認する方法がない。
- 書き込みの単位としてシリアルプロトコルで使われているページサイズがブロックサイズとまるで違うのは罠だと思う