tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトル文字列の処理につきまして
記事No13428
投稿日: 2009/02/14(Sat) 15:27
投稿者健一くん
 初めてお邪魔いたします。皆様のお知恵を拝借いたしたく、投稿させて頂きました。初心者ですが、どうかよろしくお願いいたします。

 WindowsXp(SP3)、VB(SP6)におきまして、commポートのアプリケーションを作成しようとしております。以下は、ソースの中から必要な部分を抜粋したものです。

 まず、
Private rx_data_buff As String
と変数を宣言します。

 この変数に対して
Private Sub MSComm1_OnComm()
    Select Case MSComm1.CommEvent
        Case comEvReceive
            comm_status = comm_status Or COMM_RECEIVE
            rx_data_count = rx_data_count + MSComm1.InBufferCount
            rx_data_buff = rx_data_buff & MSComm1.Input
    End Select
End Sub
とcommポートより受信します。

 その後
If (LenB(rx_data_buff) >= 5) Then
    rx_byte_num = Val("&h" & MidB(rx_data_buff, 2, 4))
    rx_byte_remain = rx_byte_num                        '←←
End If
と処理をしています。処理の内容としては、rx_data_numに受信したデータに含まれる「受信データ長」が設定される事を意図しております。
また←の行でBreakをかけてASCIIダンプをしたところ、rx_data_buffには16進表記で
02:STX
30:「0」
30:「0」
30:「0」
45:「E」
30:「0」
30:「0」
30:「0」(以下続く)
と、期待通り(送信側が送信したデータ)の値が入っています。STXの次から4バイトに「これから受信すべきデータのバイト数」が設定されており、つまり「14バイトを受信せよ」と云うことを表しております。この「14」をrx_byte_numに設定したいと考えております。

 この状態で、以下の2点をご教示下さい。

1.上記プログラムの
    rx_byte_num = Val("&h" & MidB(rx_data_buff, 2, 4))
では、なぜかrx_byte_num = 0になってしまいます。何処に問題があるのでしょうか?
Mid$、MidB$、CStr等試してみましたが、思いついた範疇ではどうやっても「0」以外にはなりませんでした。

2.←の行でBreakをかけ、ウォッチウィンドウにてrx_data_buffの内容を確認すると、「。?ぅ????」と表示されます。しかし前述のようにASCIIダンプすると、正常にデータは入っております。これは何が悪いのでしょうか?

 ソースコード等できるだけアップするようにいたしますので、ご教示よろしくお願いいたします。

[ツリー表示へ]
タイトル済みません、自己解決しました。
記事No13429
投稿日: 2009/02/14(Sat) 19:27
投稿者健一くん
 この質問を閲覧して頂いた方、ありがとうございました。タイトル通り、自己解決しました。

 MSComm1のプロパティで「InputMode」というのがありますが、これが「バイナリ」の設定となっておりました。これを「テキスト」のモードに変更することで、1と2、両方とも解決しました。

 ただ文字変数をASCIIダンプすると、「0」は「&h0030」と表現されているのに対して、STXは「&h02」となっております。VBの内部処理の一端をかいま見たような気がします。

 またこのページのご厄介になることがあるとは思いますが、その時はよろしくお願いいたします。

[ツリー表示へ]