RS232Cの制御

解決


勉3号  2008-06-28 03:37:23  No: 68626

Visual C++ 6.0でRS232Cを制御したいと思っています.現在パソコンと駆動ステージのコントローラがRS232Cで接続されています.そこで,RS232Cから,上記のコントローラの規定のコマンドを送信し,コントローラを制御したいと考えています.

http://www.ys-labo.com/BCB/2007/070512%20RS232C%20zenpan.html

正しい方法が分からなかったので,上のページをコンパイルしてみたのですが,
 error C2065: 'DataSize' : undeclared identifier
 error C2065: 'str' : undeclared identifier
 error C2065: 'Application' : undeclared identifier
 error C2227: left of '->ProcessMessages' must point to class/struct/union
 error C2065: 'MAX' : undeclared identifier
 warning C4018: '<=' : signed/unsigned mismatch
Error executing cl.exe.
のようにエラーが出てきます.どの型でエラーのでた変数を宣言すればよいでしょうか?上から4番目のエラーにはどのように対処すればよいのでしょうか?また,上記のページのソースは,一番上に書いた目的を果たすために適当な方法でしょうか?

現在探り探りな状況なので,初歩的な質問かもしれませんが,宜しくお願い致します.


  2008-06-28 16:45:31  No: 68627

初歩的というか質問の難易度が高いです。

どのプログラムを試したのですか?

(4)  実際のプログラム例
      PCのCOMポートにPICを〜

   (4−1)  文字列の送受信(CTS/RTS〜
    エディットボックスに表示するプログラム〜
    →      プログラム例

これの

http://www.ys-labo.com/pic/pic%20chips/pic%20chips%20contets/2007/070401%20RS232C%20PC_PIC.html#RS232C%204
<  プログラム例      Windows側  >
このプログラムは  C++ Buider Ver.6 でかかれています。

これでしょうか?

232C 制御 VC6で検索してみましたけど
http://www.alab.t.u-tokyo.ac.jp/~bond/doc/rs232c.html
の方が分かりやすいかも。

#ただ動作は未確認。


勉3号  2008-06-28 17:29:03  No: 68628

とさん、御返信ありがとうございます。

>どのプログラムを試したのですか?
上で示したページの(2)具体的流れ①〜⑤と⑦です。

http://www.alab.t.u-tokyo.ac.jp/~bond/doc/rs232c.html  ですが、
プログラムの構造が複雑でよく分からなかったので、
一番上で示したページを試してみました。
もう一度、お知らせ頂いたページを見直してみます。


  2008-06-28 22:11:30  No: 68629

勉3号さんが提示のサイトはC++ Buider Ver.6用に書かれているので
私の環境ではコンパイルできません。

私が想像できるのは

・DataSizeは宣言を追加
int DataSize;
・strはchar宣言を追加。サイズは適当に4096とか
char str[4096];
・Application->processMessages
は何のことだかよく分かりません。になります。

私の提示したHPのrs232cCTL.cppの関数では大雑把に
①UINT CRs232cCtl::Open(HWND hWnd, char* port_name)
②③UINT CRs232cCtl::SetComConfig(DCB* dcb)
④UINT CRs232cCtl::SetTimeouts(COMMTIMEOUTS *to)
⑤UINT CRs232cCtl::Send(char* data, unsigned int num)
⑥UINT CRs232cCtl::ReceiveThread(LPVOID arg)
⑦CRs232cCtl::~CRs232cCtl()
が対応しています。

⑥についてはスレッドを使って受信しているので
少し違いますが。

#DLしたファイルのプロジェクトファイルSerialComTest.dswは
読み込めたでしょうか?


  2008-06-28 22:38:15  No: 68630

基本は、COMポートオープンして
ボーレートやらタイムアウトやらを設定して
必要な文字列を送信して受信待つだけなので
難しく考える必要は無いと思います。

制御系だと難しいかもしれませんが
Microsoft Commコントロール(ActiveX)を使う手も
あります。
#制限あったかも。


勉3号  2008-07-01 02:42:37  No: 68631

やはりお知らせ頂いたページの方が分かりやすいですね...
とさん,関数の説明ありがとうございますm(--)mどこで何をしているか少し分かってきました!

SerialComTest.dswをコンパイルできました.ただ,SerialComTest filesの中にrs232cCTL.cppというファイルが追加されているのですが,これはどのようにプロジェクトに追加したらよいのでしょうか?

返信遅くなって申し訳ありません.


  2008-07-02 18:12:15  No: 68632

単純にプロジェクトへのファイルの追加のことでいいのでしょうか?
ワークスペースウィンドウ内のFileViewタブを開いて
ツリーの「Source Files」右クリックで「ファイルをフォルダへ追加」
で目的のファイルを選択すれば追加されます。

#そういう話じゃなかったらごめんなさい。


勉3号  2008-07-03 03:13:02  No: 68633

とさん、ありがとうございます。ファイルを追加できました!

またお尋ねしたいことがあります。SerialComTest.exeをビルドした後に、SerialComTest.exeを実行すると、Cant Open COMというメッセージが最初に出てきます。

SerialComTestDlg.cppをみてみると、以下のソースが含まれています。
//RS232c config
if(com1.Open(GetSafeHwnd(), "COM2")==0){AfxMessageBox("Cant Open COM");return TRUE;}
if(com1.SetComConfig(NULL)==0){AfxMessageBox("Cant Set COM");return TRUE;}
if(com1.SetTimeouts(NULL)==0){AfxMessageBox("Cant Set  Timeouts");return TRUE;}
com1.StartRecv();

つまり、rs232cCTL.cppのUINT CRs232cCtl::Open(HWND hWnd, char* port_name)でCOMポートを開くことができていないということでしょうか?
またその場合、どのように解決できますでしょうか?

よろしくお願いいたします。


  2008-07-03 07:20:29  No: 68634

COMポートの番号が違っているとかはありませんか? (COM2 -> COM1)とか

UINT CRs232cCtl::Open(HWND hWnd, char* port_name)
のどこかでエラーが発生しているので
return 0;
の所にブレークポイントを張って停止させてみてください。

で、本題です。
  m_hCom=CreateFile(port_name, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  if(m_hCom == INVALID_HANDLE_VALUE){
    m_strError.Format("Can't open port.");
    return 0;
  }
多分ここだと思いますが

  if(m_hCom == INVALID_HANDLE_VALUE){
    TRACE("%d\n",GetLastError());  // 追加
    m_strError.Format("Can't open port.");
    return 0;
  }
してエラー番号を取得した後、VCのIDEの「ツール」->「エラー検索」で
エラー番号の内容を確認してみてください。

今後このような事態に対応するためにも
    m_strError.Format("Can't open port.");

    m_strError.Format("Can't open port. ERROR NO = %d",GetLastError());
みたいな事に変更しておくと

呼び出し元の
//RS232c config
if(com1.Open(GetSafeHwnd(), "COM2")==0){
    AfxMessageBox(com1.m_strError);
    return TRUE; // TRUEでいいの?
}
でエラー番号が分かります。この辺は好みなので
お好きに拡張(改造)してみてください。

#あ、提示のHPと私は何の関係もありません。


勉3号  2008-07-04 03:57:52  No: 68635

COM1にしたらできました...ありがとうぞざいます!
また,エラー番号取得方法を教えていただきありがとうございます.
今後はエラー検索を使えたらなと思ってます.


  2008-07-04 07:54:53  No: 68636

うまくいって何よりです。

#内容がタイトルと離れてきていますので
#このスレは解決にして、一旦締めたほうがよいかと。


勉3号  2008-07-05 02:14:10  No: 68637

おかげさまです.
解決チェックします.


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加