やっぱフレームワークは偉大だなーと思い知る。
過去に業務で作成したツールをC#でコーディングしたため、メンテが私しかできないという問題と利便性の問題をクリアするため、同ツールのシリアル通信部分だけをC++でコーディングしてみることにしました。
まぁ、社内標準がC言語である中、思いっきりC#で組んでいる私が一方的に悪いので、せめてもの誠意は見せないとね(笑) まぁ、MATLABくらいチーム内での認知度が高ければもう少し違っていたのでしょうが・・・^^;
ま、MATLABも社内標準じゃないんだけどね(苦笑)
で、C++(Windows)でどないしたらRS-232Cを叩けるんかいなーと調べたんですが、多くの場合がMFCやらATLを使ってるんですね。で、個人的にアレがだいっ嫌いなんです。
というかあのフレームワークをさっぱり理解できなかったが故にWindowsでのGUIプログラミングを諦め、LinuxでQtに触れその洗練されたスタイルに惚れ込み、そして.NETで「MFCなんぞ2度と触りたくねぇ」と思い知った私。できることなら今回も触りたくはありません。つか、シリアル通信するだけで、GUIを構築しようとしてる訳じゃないんだからMFCなんてまっぴらごめんという訳です。
で、もうちょい調べていくとWin32APIで実現できるらしいことが分かりました。一応、VB6と.NET2.0(3.5)で通信プログラムは作成していたので、ある程度は分かるつもりでいたのですが、結構勝手が違って戸惑いました。
まず通信プロトコル(であってんのかな?)の設定。VB6や.NET2.0以上にはシリアル通信用のモジュールが用意されているため、そいつをインスタンス化して必要なプロパティを編集すればOKです。
Win32APIを叩く場合でもそれ自体は変わりませんが、そもシリアル通信を詳しくは理解できてないので、設定項目が多すぎて困りました・・・。いえ、確かにきちんと把握しておくべきなんでしょうけれど。
なんとかかんとか通信設定を終え、簡単な命令を送信。で、それが無事に動いたので、後は必要なコマンドをつらつらと実装していざテスト。
・・・、動かねぇ・・・Orz
どうも命令の送信か、あるいは受信に失敗している模様。通信方式は調歩同期式で、フロー制御はRTS/CTSと書いてあったので、ハンドシェイクだと思ったんですが、違ったんですかねぇ・・・? C#のプロパティでは確かにハンドシェイクのところにRTS制御を入れたはず。そしてそれで動いているので解釈としては間違ってないと思うのですが・・・。
また、命令がきちんと実行される場合とされない場合があるというのも厄介。再現性はあるけれどもまだ規則が見えてないんだよなぁ。そも、クエリーを投げても一切応答がないってのはどういうことよ?
可能性としては送信コマンドの内容が間違っている、かな。デリミタ文字が"\r\n"になってるので、コマンド文字列に対してstrcatでひっつけてるけど、この場合ちゃんとstrlenは"\r\n"を文字数としてカウントしてくれるんだろうか・・・? 確かしてくれるって言う風に記憶してるけど、これをきちんとカウントしてなかったら大問題だ。命令が解釈されないことになる。
クエリコマンドを投げても応答がないってことは、送信がうまく行ってない可能性と、受信がうまく行ってない可能性がある。送信後Sleepで1000ms待ってやると応答が返ってくることがあるので、受信側も怪しい。
非同期通信とはいえ、こちらからクエリを投げないと向こうからは応答は一切ないので、受信の際はバッファの中身を空っぽになるまでかっさらうという実装の仕方をしているつもりなんだけど・・・、なんか勘違いしてるのかな。
C#ではうまくいってるんだし、そっちの実装を確認してみるかなぁ。C#はかなり抽象化されてるからあんまりあてにはならんかも知れないが^^;
ん〜、うまく行けば今日中に片付きそうだったんだけどなぁ。長引かせてもしょうがないから明日には片付けよう。
SECRET: 0
返信削除PASS: 74be16979710d4c4e7c6647856088456
プログラムについてこでに言うのはすごーく,怖いんだけど,俺はカメラとかステージ動かすのにerslibっていうフリーのライブラリ使ってる.シリアルポート指定してあけて,配列に信号入れて送るだけ.
SECRET: 0
返信削除PASS: 74be16979710d4c4e7c6647856088456
いや、とても助かる。
今日もバグ取り頑張ってたんだけど、どうしても取りきれないバグがあってね。困ってたんだわ。
ほむ、明日さっそく試してみることにするー。thx!
Blogに書いてみるもんだw