Linuxを中心とした話題を投稿予定。 使用ディストリビューションであるFedoraが中心になると思われます。http://oedipa.wiki.fc2.com/にてTips Wikiを公開してます。
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[プログラム][C++]RS-232Cを叩いてみる
やっぱフレームワークは偉大だなーと思い知る。

過去に業務で作成したツールを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#はかなり抽象化されてるからあんまりあてにはならんかも知れないが^^;

ん~、うまく行けば今日中に片付きそうだったんだけどなぁ。長引かせてもしょうがないから明日には片付けよう。
関連記事
スポンサーサイト
コメント
この記事へのコメント
プログラムについてこでに言うのはすごーく,怖いんだけど,俺はカメラとかステージ動かすのにerslibっていうフリーのライブラリ使ってる.シリアルポート指定してあけて,配列に信号入れて送るだけ.
2009/01/28(Wed) 08:27 | URL  | エセ整備士 #-[ 編集]
おぉ、なんかよさげなのがあるのか!
いや、とても助かる。
今日もバグ取り頑張ってたんだけど、どうしても取りきれないバグがあってね。困ってたんだわ。

ほむ、明日さっそく試してみることにするー。thx!

Blogに書いてみるもんだw
2009/01/28(Wed) 20:36 | URL  | code_air_edge #-[ 編集]
コメントを投稿
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。