• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:RS232Cの通信が出来ない。)

RS232C通信ができず、VC++初心者が詳しい方法を教えてください

このQ&Aのポイント
  • VS2005 VC++を使って、RS-232C通信ができず、初心者が詳しい方法を教えてほしい。
  • XYステージとPCは接続できているが、RS232C通信がハングアップする箇所がある。
  • WriteMsc()関数が原因でRS232C通信がうまくいかない可能性がある。

質問者が選んだベストアンサー

  • ベストアンサー
  • nyasu_nc
  • ベストアンサー率50% (12/24)
回答No.1

こんばんわ 載せてあるコードを見て、考えられる可能な限りを書いてみたいと思います。 (1)m_strCmdがNULLポインタの可能性あり void CMscCtrl:: WriteMsc(void) { //m_strCmdがNULLの場合、抜ける(設計者へ要確認) if( m_strCmd == NULL ) return; int n = strlen(m_strCmd);      ::: (2)未通過の処理あり ※下記の場合、nAxisが1,2以外の場合、何もSetしない ※これは仕様として正しいのでしょうか? swith(nAxis){ case 1: sprintf(m_strCmd,"H:X%c%c",CR,LF); // X軸原点復帰 case 2: sprintf(m_strCmd,"H:Y%c%c",CR,LF); // Y軸原点復帰 } (3)そもそもswitch文が間違い? switch文には、break; を使う場合が多いです(使い分けます) 分からなければ、if,else,else ifで書いた方がよいかも XYステージというのを知りませんし、コードが短いため、 参考になるかどうか分かりませんが、可能性があるものをひとまず書いてみました。

kyotojun
質問者

お礼

nyasu_ncさん デバッグ中に突然動くようになりました。 あやしくまた新たな質問をすると思いますが、今後ともよろしくお願いいたします。 ありがとうございました。

kyotojun
質問者

補足

nyasu_ncさん ありがとうございます。 投稿間違いがありました、申し訳ありません。 case 1: sprintf(m_strCmd,"H:X%c%c",CR,LF);break; // X軸原点復帰 case 2: sprintf(m_strCmd,"H:Y%c%c",CR,LF);break; // Y軸原点復帰 です。 case 1にブレークポイントを置き,nAxisとm_strCmd値を確認しました。 nAxis は、1です。 m_strCmd は、0x00430700 でした。 いかがでしょうか。

すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

swith(nAxis){ case 1: sprintf(m_strCmd,"H:X%c%c",CR,LF); // X軸原点復帰 case 2: sprintf(m_strCmd,"H:Y%c%c",CR,LF); // Y軸原点復帰 } は swith(nAxis){ case 1: sprintf(m_strCmd,"H:X%c%c",CR,LF); break;// X軸原点復帰 case 2: sprintf(m_strCmd,"H:Y%c%c",CR,LF); break;// Y軸原点復帰 } ではありませんか? 現状のコードでは ・nAxisが1の時、m_strCmdに"H:X"+復帰+改行がセットされたあと、"H:Y"+復帰+改行が上書きセットされる ・nAxisが2の時、m_strCmdに"H:Y"+復帰+改行がセットされる ・nAxisが1でも2でもない時、m_strCmdは不定(初期化されない) となり、nAxisが1でも2でも同じ動きをします。 以下、蛇足。 #define CR '\x0d' #define LF '\x0a' sprintf(m_strCmd,"H:X%c%c",CR,LF); と書くよりも #define CR '\x0d' #define LF '\x0a' #define _CR "\x0d" #define _LF "\x0a" sprintf(m_strCmd,"H:X" _CR _LF); と書いた方が、無駄が無いコードになります。 以下、ANo.3について。 >switchにbreakがないため >X軸原点復帰コマンド送信後、直ちにY軸原点復帰コマンドを送信しています。 switch文の中で送信まではしてませんよ。両方のcase文を通過したとしても、m_strCmdが上書きされて違うコマンドに化けるだけで送信は1回しかしませんよ。

kyotojun
質問者

お礼

デバッグ中、突然動きました。 特に修正はしていません。ブレークポイントで各変数のチェックをしていました。 まだまだ怪しいですが、今回の質問は以上で確認していきます。 本当にありがとうございました。 別の質問ではよろしくお願いします。

kyotojun
質問者

補足

chie65535さん 投稿間違いがありました、申し訳ありません。 case 1: sprintf(m_strCmd,"H:X%c%c",CR,LF);break; // X軸原点復帰 case 2: sprintf(m_strCmd,"H:Y%c%c",CR,LF);break; // Y軸原点復帰 です。 case 1にブレークポイントを置き,nAxisとm_strCmd値を確認しました。 nAxis は、1です。 m_strCmd は、0x00430700 でした。 また参考アドバイスを有難うございました。 素人ですので、意味合い(どのように異なるのか)がわかりませんが、今後使わせていただきます。 各センサー関係はOKです。

すると、全ての回答が全文表示されます。
  • BLK314
  • ベストアンサー率55% (84/152)
回答No.2

関数名からの想像ですが、writeCommBlock()はRS-232Cにデータを出力後、直ちに戻ると思われます。(応答を待たない) ステージの場合 制御手順(プロトコル)は標準化されたものが存在せず、ステージ・コントローラにより様々です。 提示されたコードではY軸原点復帰の場合 nyasu_ncさん御潮的のように switchにbreakがないため X軸原点復帰コマンド送信後、直ちにY軸原点復帰コマンドを送信しています。 ステージの原点に復帰させるつもりで書かれたと想像します。 果たして、これは許されるのでしょうか? ステージ・コントローラによっては、一度に一つのコマンドしか受け付けないものもあります。つまり、X軸原点復帰命令を受け付けて、動作中(BUSY)状態になった後は、 原点復帰が完了し、停止中(BUSY解除)になるまで、他のコマンドを受け付けないものも存在します。コントローラのマニュアルを参照してください。 後、ハードウェアの問題ですが、センサー(原点検出センサーなど)は正常に取り付けられ、動作しているのでしょうか?センサーに異常があると、いつまでも原点復帰が完了せず、次のコマンドを実行できません。操作者からみれば、"ハングアップ"ですね?念のため、確認なさってください。

kyotojun
質問者

お礼

BLK314さん デバッグ中突然動くようになりました。 怪しいので、また質問をするかも知れませんがよろしくご指導お願いいたします。 今回はありがとうございました。

kyotojun
質問者

補足

BLK314さん 投稿間違いがありました、申し訳ありません。 case 1: sprintf(m_strCmd,"H:X%c%c",CR,LF);break; // X軸原点復帰 case 2: sprintf(m_strCmd,"H:Y%c%c",CR,LF);break; // Y軸原点復帰 です。 case 1にブレークポイントを置き,nAxisとm_strCmd値を確認しました。 nAxis は、1です。 m_strCmd は、0x00430700 でした。 各センサー関係はOKです。 DOSコマンドで、DOS窓からの直接コマンドで正常動作しています。

すると、全ての回答が全文表示されます。

関連するQ&A