tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルキャプションに表示できない
記事No11049
投稿日: 2008/01/04(Fri) 22:35
投稿者Beginner
初めて投稿します。初歩的なこと(だと思うのですが)で悩んでいます。
環境はVB6.0(SP6)+WindowsXPです。

MSCommを使って受信したバイナリデータをラベルに表示しようとしています。
Private Sub MSComm1_OnComm()          'のなかで、
     Select Case MSComm1.CommEvent
          Case comEvReceive
               Dim Buffer As Variant
               Dim str As String

               Buffer = MSComm1.Input
               str = CStr(Buffer)
                    '@
               Label1.Caption = str

とやり、文字コードの範囲の値を受信しても、ラベルには何も表示されません。
@の位置でMsgBoxで表示させると正しく表示します。ただし、Len(str)はゼロになります。
データ型が関係している気がするのですが、よくわかりません。

アドバイスをよろしくお願いします。

[ツリー表示へ]
タイトルRe: キャプションに表示できない
記事No11051
投稿日: 2008/01/05(Sat) 01:28
投稿者花ちゃん
> @の位置でMsgBoxで表示させると正しく表示します。
何を表示させたのですか? str  or Buffer  又は、CStr(Buffer)

> データ型が関係している気がするのですが、よくわかりません。

どのようなデータが取得できるのか説明して頂かないと...。

投稿されたコード 以降 のコードはどのようになっていますか?
(実際のコードと投稿したコードは違っていませんか(省略したり))

[ツリー表示へ]
タイトルRe^2: キャプションに表示できない
記事No11052
投稿日: 2008/01/05(Sat) 08:19
投稿者Beginner
花ちゃんさん、返信ありがとうございました。説明不足ですみません。

例として外部から0x41="A"を送信してこれを受信してみました。
回線上のデータはプロトコルモニタで確認しています。

> 何を表示させたのですか? str  or Buffer  又は、CStr(Buffer)
     MsgBox str
としたところ、正しく"A"が表示されます。

ステップ実行で見てみると、
     str = Cstr(Buffer)
までは正しく代入されているのですが、、
     Label1.Caption = str
を実行すると、左辺が "" 、右辺が"A"となり、代入が実行されません。

よろしくお願いします。

[ツリー表示へ]
タイトルRe^3: キャプションに表示できない
記事No11053
投稿日: 2008/01/05(Sat) 08:50
投稿者Beginner
投稿した以降のコードは、標準的なものです。

     Case comEventBreak
          MsgBox "中断信号受信", vbExclamation, "通信エラー"

といったエラーイベントに対する表示コードが並び、

     End Select
End Sub

と続きます。

よろしくお願いします。

[ツリー表示へ]
タイトルRe^3: キャプションに(追記)
記事No11054
投稿日: 2008/01/05(Sat) 09:11
投稿者花ちゃん
> としたところ、正しく"A"が表示されます。
>
> ステップ実行で見てみると、
>      str = Cstr(Buffer)
> までは正しく代入されているのですが、、
>      Label1.Caption = str
> を実行すると、左辺が "" 、右辺が"A"となり、代入が実行されません。

下記では、Label に表示されますか?
Private Sub Command1_Click()
   Dim Buffer As Variant
   Dim str As String
   Buffer = Chr$(&H41)
   str = CStr(Buffer)
  ’ MsgBox str
   Label1.Caption = str
End Sub


又、現在のコードを下記コードに変更した場合どうなりますか?

   Dim Buffer As Variant
   Dim str As String
   Buffer = MSComm1.Input
   str = CStr(Buffer)
   Debug.Print Len(str)
   Debug.Print str
   Debug.Print Asc(str)
   Label1.Caption = Replace(str, vbNullChar, "")


送・受信モードは、テキストになっていますよね。
MSComm1.InputMode = comInputModeText

[ツリー表示へ]
タイトルRe^4: キャプションに(追記)
記事No11055
投稿日: 2008/01/05(Sat) 11:33
投稿者Beginner
お世話になります。

> 下記では、Label に表示されますか?
> Private Sub Command1_Click()
>    Dim Buffer As Variant
>    Dim str As String
>    Buffer = Chr$(&H41)
>    str = CStr(Buffer)
>   ’ MsgBox str
>    Label1.Caption = str
> End Sub
>
正しく表示されます。

> 又、現在のコードを下記コードに変更した場合どうなりますか?
>
>    Dim Buffer As Variant
>    Dim str As String
>    Buffer = MSComm1.Input
>    str = CStr(Buffer)
>    Debug.Print Len(str)
>    Debug.Print str
>    Debug.Print Asc(str)
>    Label1.Caption = Replace(str, vbNullChar, "")
>
やってみたところ、
     Debug.Print Asc(str)
の箇所で「実行時エラー'5' プロシージャの呼び出し、または引数が不正です」となります。
この行をコメントアウトすると、ラベルはクリアされます。

>  送・受信モードは、テキストになっていますよね。
>  MSComm1.InputMode = comInputModeText
>
現在はデバッグのためテキストデータを受信していますが、最終的にはバイナリデータを
受信したいので、
     MSComm1.InputMode = comInputModeBinary
としています。
最終的には 2バイト長の受け取ったバイナリデータから16bit長のデータを組み立てて、
それをテキスト(数字)に変換してラベルに表示する予定です。

よろしくお願いします。

[ツリー表示へ]
タイトルRe^5: キャプションに(追記)
記事No11056
投稿日: 2008/01/05(Sat) 11:56
投稿者花ちゃん
>      Debug.Print Asc(str)
> の箇所で「実行時エラー'5' プロシージャの呼び出し、または引数が不正です」となります。
    Debug.Print Len(str)
    Debug.Print str
の部分はどうなのですか?

> >  送・受信モードは、テキストになっていますよね。
> >  MSComm1.InputMode = comInputModeText
> >
> 現在はデバッグのためテキストデータを受信していますが、最終的にはバイナリデータを
> 受信したいので、
>      MSComm1.InputMode = comInputModeBinary
> としています。

現在のテスト段階では、 MSComm1.InputMode = comInputModeBinary なのですか?
貴方の投稿を見ている人は、貴方のそばで、貴方のPCを見ている訳ではないので
質問内容や状況は詳しく書いて頂かないと判断できませんよね。
本当に
  Buffer = MSComm1.Input
    str = CStr(Buffer)
    MsgBox "[" & str & "]"
で正しく表示されているのですか?

[ツリー表示へ]
タイトルRe^6: キャプションに(追記)
記事No11059
投稿日: 2008/01/05(Sat) 13:14
投稿者Beginner
何度も説明不足ですみません。

>    Debug.Print Len(str)  ← 0 が表示されます
>    Debug.Print str         ←何も表示されません
>                              イミディエートウィンド内で改行はされます
> の部分はどうなのですか?
     Debug.Print LenB(str)   ←とやったところ、 1 が表示されました

> 現在のテスト段階では、 MSComm1.InputMode = comInputModeBinary なのですか?
>
そのとおりです。

> 本当に
>   Buffer = MSComm1.Input
>     str = CStr(Buffer)
>     MsgBox "[" & str & "]"
> で正しく表示されているのですか?
     MsgBox str                 では正しく A が表示されますが、
     MsgBox "[" & str & "]"     では [? となってしまいます。

よろしくお願いします。

[ツリー表示へ]
タイトルRe^7: キャプションに(追記)
記事No11061
投稿日: 2008/01/05(Sat) 14:21
投稿者花ちゃん
> > 現在のテスト段階では、 MSComm1.InputMode = comInputModeBinary なのですか?
> >
> そのとおりです。

だったらバイナリモードで取得しないとまずいでしょう。

   Dim Buffer() As Byte
   Dim i        As Long
   MSComm1.InputMode = comInputModeBinary
   Buffer = MSComm1.Input
   For i = LBound(Buffer) To UBound(Buffer)
      Label1.Caption = Label1.Caption & Chr$(Buffer(i))
   Next i

>      MsgBox str                 では正しく A が表示されますが、
>      MsgBox "[" & str & "]"     では [? となってしまいます。

正しく A が表示されていないから [?  になるのでは。
送信元のデータの文字コードや送信モードはどのようになっていますか?

送信元と受信先の設定は同じにしておいて下さいね。


多分下記のような状態になっているのでは。

Private Sub Command1_Click()
   Dim Buffer(0) As Byte
   Dim i        As Long
   Buffer(0) = &H41
   Dim str As String
   str = CStr(Buffer)
   MsgBox str
   MsgBox "[" & str & "]"
  
  '正しい取得
   str = Chr$(Buffer(0))
   MsgBox str
   MsgBox "[" & str & "]"
End Sub

[ツリー表示へ]
タイトル解決しました
記事No11062
投稿日: 2008/01/05(Sat) 15:04
投稿者Beginner
何度もお世話になります。

> だったらバイナリモードで取得しないとまずいでしょう。
>
>    Dim Buffer() As Byte
>    Dim i        As Long
>    MSComm1.InputMode = comInputModeBinary
>    Buffer = MSComm1.Input
>    For i = LBound(Buffer) To UBound(Buffer)
>       Label1.Caption = Label1.Caption & Chr$(Buffer(i))
>    Next i
>
このコードを試したらうまくいきました。
ただし、現在は1バイトのデータを受信して確認中のため、
LBound(Buffer)も、UBound(Buffer)もともに 1 でした。そこで、
For〜Nextループをやめて、Label1.Caption = Chr$(Buffer(0))
としました。

> >      MsgBox str                 では正しく A が表示されますが、
> >      MsgBox "[" & str & "]"     では [? となってしまいます。
>
> 正しく A が表示されていないから [?  になるのでは。
おっしゃるとおりですが、 MsgBox str では、 A と表示されるのです。


> 送信元のデータの文字コードや送信モードはどのようになっていますか?
>
送信側は下記にある「シリアル通信チェッカー」というソフトを使用しています。
   http://www.asterworld.com/ja/soft/commchk.html
また、パソコンの外部(COMポート間)にはスタンドアロンのプロトコルモニタを
接続しており、ASCII/HEXモードで 0x41 を確認しておりました。

当面の問題点はおかげ様でこれで解決しましたので、デバッグを続けます。

ありがとうございました。

[ツリー表示へ]
タイトル追伸
記事No11063
投稿日: 2008/01/05(Sat) 15:18
投稿者Beginner

今回、MSCommを使用したのが初めてだったこと、また、バイナリモードに対する
理解が不足していたことが原因だと思います。

ありがとうございました。

[ツリー表示へ]
タイトルRe: 追伸
記事No11073
投稿日: 2008/01/07(Mon) 10:50
投稿者よねKEN
> 今回、MSCommを使用したのが初めてだったこと、また、バイナリモードに対する
> 理解が不足していたことが原因だと思います。

VBの文字列はUnicodeだということの認識不足も一因ではないでしょうか。
0x41 はShift-JIS(ASCII)では"A"ですが、Unicodeではそうではありません。
Unicodeでは"A"は0x00 0x41の2バイトです。

0x41がセットされたバッファをそのままStringに代入すると
不完全な文字のため表示できません。
StrConv関数を介してShift-JIS→Unicodeに変換するとか、
Chr関数でShift-JISの文字コードデータから文字に変換するといった
何らかの変換が必要でした。

#MsgBoxで0x41だけの場合に"A"と表示される理由は不明ですが、何か特別な仕様によるものでしょうかね。

[ツリー表示へ]