[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/04/26(Tue) 15:48
投稿者名:なまごん
URL :
タイトル:
MSCommについて
VB6.0を使用しています。
機器とパソコンを232Cで通信しているのですが、
機器の電源を立ち上げた時にハード的にHEXでE0を吐き出して来てしまいます。
EOの時はキャンセルしたいのですが、Inputを変数(Buffer)に入れる1行(B)を処理するのに15秒
程度かかってしまってます。(約850Mhzのパソコンで)
InputModeをcomInputModeBinary(Aをコメントして@を使用)にすると直ぐに処理できるのですが
変数(Buffer)にMSComm1.Inputがうまく入らず他の通信が出来ない状態です。
(色々変換してみたのですが・・・)

またパソコン同士を232CでつないでE0を送っても同じような状態でした。

E0のデータがきても処理に時間が掛からない方法、InputModeがcomInputModeBinary
の時の扱い方など何か良い方法がありましたら教えて下さい。

232Cの設定(制御線は使用していません。)
Private Sub Form_Load()
    With MSComm1
        .InBufferSize = 1024
        .OutBufferSize = 1024
        .InputLen = 1
        .RThreshold = 1
        .CommPort = 1
        .Settings = "38400,N,8,1"
        .PortOpen = True
    End With
End Sub

Private Sub MSComm1_OnComm()
Dim buffer As Variant
    Select Case MSComm1.CommEvent
        Case comEvReceive
            'MSComm1.InputMode = comInputModeBinary   '@
            MSComm1.InputMode = comInputModeText    'A
            buffer = MSComm1.Input            'B
    End Select
End Sub

投稿時間:2005/04/26(Tue) 21:08
投稿者名:岡田 之仁
URL :
タイトル:
Re: MSCommについて
> Private Sub MSComm1_OnComm()
> Dim buffer As Variant
>     Select Case MSComm1.CommEvent
>         Case comEvReceive
>             'MSComm1.InputMode = comInputModeBinary   '@
>             MSComm1.InputMode = comInputModeText    'A
>             buffer = MSComm1.Input            'B
>     End Select
> End Sub

  こんな無茶なことを見たのは、初めてです・・・
  通常、モード設定は、COMポートのオープン時に行い、あとはそれに従って
  受信割り込みでデータを読み込むのですが・・・

  受信イベントの中でモードの設定変更を行うのは、エラーしないからといって
  行うのは、ナンセンスです。

  それと、『&hE0』を受信するなら、あくまでバイナリモードでしょう。

  ご検討下さい。

※ E0を吐き出す機器が、ハード的にどうしようもないとのことですが
  ブレーク信号を出すか、制御線を操作しても、それは変化しないの
  か、もしくは、一定時間経過するか、何かコマンドを送信すれば、
  止まるということでしょうか?

  であれば、止まった時点で受信バッファにあるデータは、全て読み
  ほかせばいいのではないでしょうか。どのみちそれ以降のデータし
  か意味が無いので・・・

以上。

投稿時間:2005/04/26(Tue) 22:10
投稿者名:なまごん
URL :
タイトル:
Re^2: MSCommについて
御回答有難う御座います。

>   こんな無茶なことを見たのは、初めてです・・・
>   通常、モード設定は、COMポートのオープン時に行い、あとはそれに従って
>   受信割り込みでデータを読み込むのですが・・・
>
>   受信イベントの中でモードの設定変更を行うのは、エラーしないからといって
>   行うのは、ナンセンスです。

おっしゃる通りです。デバック用に作ったものとはいえナンセンスでした。
以後気を付けます。


>   それと、『&hE0』を受信するなら、あくまでバイナリモードでしょう。
>
>   ご検討下さい。

バイナリモードでも試みたのですが、例えば、HEXで31(アスキーで1)を受信した場合に
buffer = MSComm1.InputのBuffer
のbufferにうまくデータが入ってくれません。
bufferの型も色々変えて見たのですが・・・
バイナリモードで使用するのは思考錯誤して今回が初めてなのですが、根本的にテキストモードと
使い方が違うのでしょうか?


> ※ E0を吐き出す機器が、ハード的にどうしようもないとのことですが
>   ブレーク信号を出すか、制御線を操作しても、それは変化しないの
>   か、もしくは、一定時間経過するか、何かコマンドを送信すれば、
>   止まるということでしょうか?
>
>   であれば、止まった時点で受信バッファにあるデータは、全て読み
>   ほかせばいいのではないでしょうか。どのみちそれ以降のデータし
>   か意味が無いので・・・

説明不足でした、申し訳有りません。
機器とは常時ケーブルは接続してパソコンは受信待ちの状態で、パソコンから
1定間隔で要求信号を出力しています。
頻繁ではないのですが、機器は電源が入ったり切れたりし、電源が入るたびに1回「E0」を出力してきま
す。
制御線は機器側が何も見ていないので繋がっていないのと同じ状態です。
また、機器の電源が入っているかどうかもパソコンから要求信号を出力して帰ってこないときに切れて
いる
と分かるので、いつ機器の電源が入るか分からない状態です。

テキストモードで受信すると1行の処理がかなり掛かってしまうため、要求信号を出力するのが
だいぶ遅れてしまい、その間のデータが取れなく、
バイナリモードだと処理時間は掛からないのですが、受信データがうまく変数に入らないため通常の受

が出来ない状態です。
受信データはSTX(02)・・・・・ETX(03)でくるので、バイナリモードでうまく受信できれば「E0」を
とばして読み込もうと思ったのですが・・・・

何か良い策はあるのでしょうか?
御教授願います。

投稿時間:2005/04/27(Wed) 01:10
投稿者名:Starfish
Eメール:
URL :
タイトル:
Re^3: MSCommについて

 &HE0は、シフトJISでは、全角文字の1バイト目のコードですので、テキスト
モードだと、2バイト目がくるのをしばらく待っているのでしょう。

 バイナリーモードの場合は、バイト配列を使います。

 STXからETXまでの間のデータを、取り出して文字列に変換するコードを
書いてみました。コンパイルエラーは落としてありますが、デバッグはしていません、
こんな感じでやればできるということで参考にしてください。STXとETXが
分かれて受信するところまでは考慮はしています。

Private Sub MSComm1_OnComm()
Dim bytBuffer() As Byte
Dim strData As String
Static bytData() As Byte
Static blnRecieve As Boolean ' 受信中

    Select Case MSComm1.CommEvent
    Case comEvReceive
        bytBuffer = MSComm1.Input
        If blnRecieve = False Then  ' STXを受信していない
            If InStrB(bytBuffer, ChrB(2)) > 0 Then  ' STX受信?
                blnRecieve = True
                bytData = ""
                bytBuffer = MidB(bytBuffer, InStrB(bytBuffer, ChrB(2)) + 1)
            End If
        End If
        If blnRecieve Then  ' STX受信済
            If InStrB(bytBuffer, ChrB(3)) > 0 Then  ' ETX受信?
                If InStrB(bytBuffer, ChrB(3)) > 1 Then
                    bytData = CStr(bytData) & LeftB(bytBuffer, InStrB(bytBuffer, ChrB(3)) -
1)
                End If
                blnRecieve = False
                strData = StrConv(bytData, vbUnicode)
                ' strData に、文字列に変換したデータが入ります。ここに受信処理を入れてください
            Else
                bytData = CStr(bytData) & CStr(bytBuffer)
            End If
        End If
    End Select

End Sub

投稿時間:2005/04/27(Wed) 14:35
投稿者名:なまごん
URL :
タイトル:
Re^4: MSCommについて
Starfish様 助言有難う御座います。

>  &HE0は、シフトJISでは、全角文字の1バイト目のコードですので、テキスト
> モードだと、2バイト目がくるのをしばらく待っているのでしょう。

アスキーしか使用したことがなかったので、シフトJIS&テキストモードの件
知りませんでした。

>  バイナリーモードの場合は、バイト配列を使います。

はい。

>  STXからETXまでの間のデータを、取り出して文字列に変換するコードを
> 書いてみました。コンパイルエラーは落としてありますが、デバッグはしていません、
> こんな感じでやればできるということで参考にしてください。STXとETXが
> 分かれて受信するところまでは考慮はしています。
>
> Private Sub MSComm1_OnComm()
> Dim bytBuffer() As Byte
> Dim strData As String
> Static bytData() As Byte
> Static blnRecieve As Boolean ' 受信中
>
>     Select Case MSComm1.CommEvent
>     Case comEvReceive
>         bytBuffer = MSComm1.Input
>         If blnRecieve = False Then  ' STXを受信していない
>             If InStrB(bytBuffer, ChrB(2)) > 0 Then  ' STX受信?
>                 blnRecieve = True
>                 bytData = ""
>                 bytBuffer = MidB(bytBuffer, InStrB(bytBuffer, ChrB(2)) + 1)
>             End If
>         End If
>         If blnRecieve Then  ' STX受信済
>             If InStrB(bytBuffer, ChrB(3)) > 0 Then  ' ETX受信?
>                 If InStrB(bytBuffer, ChrB(3)) > 1 Then
>                     bytData = CStr(bytData) & LeftB(bytBuffer, InStrB(bytBuffer, Chr
B(3)) -
> 1)
>                 End If
>                 blnRecieve = False
>                 strData = StrConv(bytData, vbUnicode)
>                 ' strData に、文字列に変換したデータが入ります。ここに受信処理を入れてく
ださい
>             Else
>                 bytData = CStr(bytData) & CStr(bytBuffer)
>             End If
>         End If
>     End Select
>
> End Sub

コードを参考にしたところ正常に受信することが出来ました。
(お恥ずかしい話しですが「StrConv」知りませんでした・・・)

至れり尽くせりで参考のコードまで作成して頂き、有難う御座いました。
参考コードは保管して今後も参考にさせて頂きます。

本当に有難う御座いました。(助かりました・・・)

投稿時間:2005/04/26(Tue) 22:36
投稿者名:わたしき
Eメール:
URL :
タイトル:
Re: MSCommについて
> VB6.0を使用しています。
> 機器とパソコンを232Cで通信しているのですが、
> 機器の電源を立ち上げた時にハード的にHEXでE0を吐き出して来てしまいます。
> EOの時はキャンセルしたいのですが、Inputを変数(Buffer)に入れる1行(B)を処理するのに1
5秒
> 程度かかってしまってます。(約850Mhzのパソコンで)
> InputModeをcomInputModeBinary(Aをコメントして@を使用)にすると直ぐに処理できるのです

> 変数(Buffer)にMSComm1.Inputがうまく入らず他の通信が出来ない状態です。
> (色々変換してみたのですが・・・)
>
> またパソコン同士を232CでつないでE0を送っても同じような状態でした。
>
> E0のデータがきても処理に時間が掛からない方法、InputModeがcomInputModeBinary
> の時の扱い方など何か良い方法がありましたら教えて下さい。
>
> 232Cの設定(制御線は使用していません。)
> Private Sub Form_Load()
>     With MSComm1
>         .InBufferSize = 1024
>         .OutBufferSize = 1024
>         .InputLen = 1
>         .RThreshold = 1
>         .CommPort = 1
>         .Settings = "38400,N,8,1"
>         .PortOpen = True
>     End With
> End Sub
>
> Private Sub MSComm1_OnComm()
> Dim buffer As Variant
>     Select Case MSComm1.CommEvent
>         Case comEvReceive
>             'MSComm1.InputMode = comInputModeBinary   '@
>             MSComm1.InputMode = comInputModeText    'A
>             buffer = MSComm1.Input            'B
>     End Select
> End Sub

なかなか面白い苦肉の策ですね。
センスがどうこう言われる筋合いは無いと思いますが。

ところで、PCと、起動時&hE0を吐き出す機器、どちらが上位なんでしょうか?
PCがマスターで接続機器がスレーブなのであれば、
PCはリクエストするまで機器から勝手に送信されたコードは無視すれば良いだけかと。
リクスト前にバッファをクリアすればよいのではないでしょうか。
要はOnCommイベントを使わない事です。
そしてテキストで1バイト受信すると、2バイトになってしまうという・・・
この先は調べてくださいね。

投稿時間:2005/04/27(Wed) 14:12
投稿者名:なまごん
URL :
タイトル:
Re^2: MSCommについて
わたしき様 助言有難う御座います。

> なかなか面白い苦肉の策ですね。
> センスがどうこう言われる筋合いは無いと思いますが。

かたじけないです。

> ところで、PCと、起動時&hE0を吐き出す機器、どちらが上位なんでしょうか?
> PCがマスターで接続機器がスレーブなのであれば、
> PCはリクエストするまで機器から勝手に送信されたコードは無視すれば良いだけかと。
> リクスト前にバッファをクリアすればよいのではないでしょうか。
> 要はOnCommイベントを使わない事です。
> そしてテキストで1バイト受信すると、2バイトになってしまうという・・・
> この先は調べてくださいね。

テキストの件知りませんでした・・・

接続機器がマスターだったのですが、バイナリモードで受信することにより
解決できましたので御礼申し上げます。

色々と有難う御座いました。