RS-232Cでの文字列受信

[戻る]
駆け出しド素人 2004/01/05(月) 13:21:47
はじめて書き込みさせていただきます。最近、勉強をはじめたばかりの初心者です。
よろしくお願いします。

visual C++ .NET 2003を使っています。
(Microsoft Visual Environment 2003 Ver 7.1.3091)

 シリアル通信(RS-232C)の受信イベントをどのように設定したら良いのか分からず、
困っています。どなたか、教えて頂ければ幸いです。
 MFCのダイアログベースで、電話マークを貼り付けた状態でプログラミングを始め
ました。scicom1.cppという名前のプロジェクトを作成し、インクルードファイルは
#include "stdafx.h"
#include "scicom1.h"
#include "scicom1Dlg.h"
#include ".\scicom1dlg.h"
です。また、通信に関する初期設定のリストは、以下のとおりです。

*************** 初期設定 ****************
BOOL Cscicom1Dlg::OnInitDialog()
{
    CDialog::OnInitDialog();

<<<中略>>>

    //シリアル通信初期化
    m_comm.put_CommPort(short(1));
    str="19200,n,7,1";
    m_comm.put_Settings(str);
    m_comm.put_InputLen(short(0));
    m_comm.put_PortOpen(true);

    return TRUE;
}
*******************************************


 サンプル1のように書くと、strに入っている文字列の送信後、アスキーコード69に相当する
文字(つまり、"E")を受信するまで受信動作を実行できます。これはこれで、予定通りの動作
なので、ケーブルの断線などは無く受信動作そのものはできる環境にあると思われます。しかし
このままでは、ごく限られたタイミングでしか受信動作ができないことになってしまいます。
そこで、文字列受信を常に監視したいと思い、電話マークのプロパティからイベント設定して、
サンプル1と同じように、"E"を受信するまで受信動作を続ける、というプログラムを追加した
ものがサンプル2です。ところが、この状態では受信動作が全くできなくなってしまいました。
サンプル2の先頭行にブレイクを設定した状態でいくら文字列を送信してもブレイクポイント
まで飛んでこないのです。
他にどのような設定をすれば、受信イベントが発生するのでしょうか?
よろしくおねがいします。

---------------------------  ↓サンプル1↓ -------------------------------------

void Cscicom1Dlg::OnBnClickedButton1()
{
    CString str;

    CEdit*m_edit1=(CEdit*)GetDlgItem(IDC_EDIT1);
    COleVariant var;
//送信
    m_edit1->GetWindowText(str);
    var=str;str="";
    m_comm.put_Output(var);
//受信
    while(str.ReverseFind(69)==-1)
    {
        str = m_comm.get_Input();
    }

    m_static1.SetWindowText(str);
}
---------------------------  ↑サンプル1↑ -------------------------------------


===========================  ↓サンプル2↓ =====================================
BEGIN_EVENTSINK_MAP(Cscicom1Dlg, CDialog)
    ON_EVENT(Cscicom1Dlg, IDC_MSCOMM1, 1, OnCommMscomm1, VTS_NONE)
END_EVENTSINK_MAP()

void Cscicom1Dlg::OnCommMscomm1()
{
    // TODO : ここにメッセージ ハンドラ コードを追加します。
    CString str;

    //受信
    while(str.ReverseFind(69)==-1)
    {
        str = m_comm.get_Input();
    }

    m_static1.SetWindowText(str);
}

===========================  ↑サンプル2↑ =====================================

よろしくお願いします
以上

けみ [E-Mail] 2004/01/05(月) 16:35:16
MSCommコントロールの話だと思いますが、違っていたらご勘弁を
MSDNのMSCommコントロールの解説によると

>CommEvent プロパティの値が変化すると、OnComm イベントが常に発生します
とあります。で下のほうに
>RThreshold プロパティを 0 に設定すると comEvReceive イベントが
>トラップされなくなるので注意してください。

さらにRThresholdの解説を見ると
>RThreshold プロパティを 0 (既定値) に設定すると、文字を受信しても 
>OnComm イベントは発生しません。
とあります。
#(規定値 0)


長々と引用しましたが
SetRThreshold(n); (かな?) でnバイト受信時にイベントが発生するかを指定して
あげないと駄目なんではないでしょうか。

#VCで使ったことないので細かいこと聞かれても答えられませんが。。

駆け出しド素人 2004/01/06(火) 19:05:39
けみさん、ありがとうございました。MSCommコントロールの話で間違えありません。
ということで、昼間、書き込み通りにやってみたところ解決しました。
ありがとうございました。

駆け出しド素人 2004/01/08(木) 08:58:21
[[解決]]
チェックを入れるのを忘れていたので、再書き込みいたします。

古いスレッドには追加発言できません。