RS232C 設定反映

解決


チロル  2005-07-14 01:19:23  No: 123489

RS232Cの通信プログラムについて勉強中です。
今回の質問は正直、関数の使用方法レベルの話で恐縮なのですが、どうしても解決ができずご教授お願いします。
以下のプログラムで実行したとき、ctlCommのコンパイルエラーが出てしまいます。
また、エラーのでる箇所をいくつか変更し試してみましたが、オブジェクト変数が認識されていないというエラーがでます。
初歩的な質問で恐縮なのですが、どのようにしたらエラーが出ず正常に設定を反映させることができるのか教えてください。

通信データ構造体は略

↓設定ボタンを押したときのプログラム
Private Sub cmdSetup_Click()

    COMM_DATA.comm_port = CInt(Mid(cmbCommPort.Text, 4))
    COMM_DATA.port_speed = cmbPortSpeed.Text
    COMM_DATA.data_bit = cmbDataBit.Text
    COMM_DATA.stop_bit = cmbStopBit.Text
    
    If cmbParity.Text = "なし" Then
        COMM_DATA.parity = "N"
    ElseIf cmbParity.Text = "奇数" Then
        COMM_DATA.parity = "O"
    ElseIf cmbParity.Text = "偶数" Then
        COMM_DATA.parity = "E"
    End If
    If cmbFllow.Text = "なし" Then
        COMM_DATA.fllow = "0"
    ElseIf cmbFllow.Text = "ソフトウェア" Then
        COMM_DATA.fllow = "1"
    ElseIf cmbFllow.Text = "ハードウェア" Then
        COMM_DATA.fllow = "2"
    End If
    
    If commOpen(ctlComm) = 0 Then
        MsgBox "設定完了", vbCritical, "確認画面"
    End If
    
End Sub

↓ MainModule内プログラム
Public Function commOpen(ctlComm As Object) As Integer

    On Error GoTo ErrorHandle
    '通信設定値を反映
    With COMM_DATA
        ctlComm.CommPort = .comm_port
        ctlComm.Settings = .port_speed + "," + .parity + "," + .data_bit + "," + .stop_bit
        
        Select Case .fllow
        Case 0
            ctlComm.Handshaking = comNone
        Case 1
            ctlComm.Handshaking = comXOnXoff
        Case 2
            ctlComm.Handshaking = comRTS
        End Select
    End With
    ctlComm.RTSEnable = True
    ctlComm.PortOpen = True
    commOpen = 0
    
    Exit Function

ErrorHandle:
    MsgBox "通信ポートの設定が正常に行えませんでした", vbCritical, "通信ポート設定エラー"
    commOpen = -1
End Function


ねろ  2005-07-14 01:55:50  No: 123490

On Error GoTo ErrorHandleをコメントアウトすると
実際にはどこで、どのようなエラーが出ますか?


チロル  2005-07-14 02:05:39  No: 123491

レス有難うございます。
”オブジェクト変数または With ブロック変数が設定されていません。”
というエラーが出ます。


チロル  2005-07-14 02:09:01  No: 123492

場所を記入していませんでした。

With COMM_DATA
        ctlComm.CommPort = .comm_port  ←ここで止まります。
        ctlComm.Settings = .port_speed + "," + .parity + "," + .data_bit + "," + .stop_bit

デバックですとCOMM_DATA.comm_portへ値は入っています。
ので、ctlComm.CommPort がうまく認識されてないのだと考えています。
素人っぽい表現ですみません。


いな  2005-07-14 02:14:13  No: 123493

>ので、ctlComm.CommPort がうまく認識されてないのだと考えています。

ウォッチ式、やイミディエイトウィンドウで参照したとき、
"オブジェクト変数または With ブロック変数が設定されていません。"

と確認できるはずですので、まずは確定(Commit)させましょう!
っていうか、確定してから質問しようよ、そこまで調査できているのならば。


ねろ  2005-07-14 02:31:21  No: 123494

特に問題が有りそうな点は見当たりません。
取りあえず、宣言を含め全て提示されたコードを
MainModuleの上ではなく、呼び出すFormの上に
書いたみたらいかがでしょうか。


ねろ  2005-07-14 02:35:21  No: 123495

いなさんと被った。(^^;
宣言の部分が無いので良くわかりませんが、
>"オブジェクト変数または With ブロック変数が設定されていません。”
このエラーはなんとなくいやな匂いがするのですが。


いな  2005-07-14 02:53:19  No: 123496

ん〜、っと先の書き方ではかわいそうなので、
チョットやわらかい言い方に

ctlComm.CommPortが、
"オブジェクト変数または With ブロック変数が設定されていません。"

ってことは、

「そんな変数オラ知らねぇ〜」っていうことなんだけれども、
スコープの範囲内に宣言されてる?


チロル  2005-07-14 02:53:50  No: 123497

申し訳ございません。重要なこと質問ミスしていました。

まず、最初ここで”コンパイルエラー  変数が定義されていません”となったため(エラー箇所は下に記入しました)
そのため
Dim ctlComm As Object の一行を追加してしまいました。
そして、質問で上げたソースがその一行を付け足す前のソースでした。
その後のエラーは  Dim ctlComm As Object の一行を追加した状態でのエラーということになります。
ヤヤコシクしてしまって申し訳ありません。

Commitに関しては使用方法がわからないので、調べております;;

↓設定ボタンを押したときのプログラム
Private Sub cmdSetup_Click()

    COMM_DATA.comm_port = CInt(Mid(cmbCommPort.Text, 4))
    COMM_DATA.port_speed = cmbPortSpeed.Text
    COMM_DATA.data_bit = cmbDataBit.Text
    COMM_DATA.stop_bit = cmbStopBit.Text
    
    If cmbParity.Text = "なし" Then
        COMM_DATA.parity = "N"
    ElseIf cmbParity.Text = "奇数" Then
        COMM_DATA.parity = "O"
    ElseIf cmbParity.Text = "偶数" Then
        COMM_DATA.parity = "E"
    End If
    If cmbFllow.Text = "なし" Then
        COMM_DATA.fllow = "0"
    ElseIf cmbFllow.Text = "ソフトウェア" Then
        COMM_DATA.fllow = "1"
    ElseIf cmbFllow.Text = "ハードウェア" Then
        COMM_DATA.fllow = "2"
    End If
    
    If commOpen(ctlComm) = 0 Then    ←ここのctlCommへカーソルが行きエラーとなりました。
        MsgBox "設定完了", vbCritical, "確認画面"
    End If
    
End Sub


特攻隊長まるるう  2005-07-14 03:01:53  No: 123498

ctlComm が何か?ってのが一番知りたかったり…
フォーム上にデザイン画面で貼り付けた
コミュニケーション (MSComm) コントロール
ですか?

エラーの直接の原因とは関係ないかもしれないけど
>Public Function commOpen(ctlComm As Object) As Integer
が気持ち悪いので
Public Function commOpen(ctlCommA As MSComm) As Integer
とデータ型をハッキリさせて同じ名前の変数を使わないようにして、
フォーム側の
>    If commOpen(ctlComm) = 0 Then

    If commOpen(Me.ctlComm) = 0 Then
としてみて下さい。

できれば cmbParity とかも Me.cmbParity に…


いな  2005-07-14 03:07:55  No: 123499

>ん〜、いいたいことはまるるうさんが語ってしまったので、

ゴメン、あのさ
Dim ctlComm As Object の一行を追加してしまいました。

というけど、極力"AS Object"

系の変数宣言を明示的に宣言した方がいいと思うのね。


いな  2005-07-14 03:09:43  No: 123500

あ、ゴメン、
>Commitに関しては使用方法がわからないので、調べております;;

これはただの英語、VBとは関係ありません。


チロル  2005-07-14 03:14:13  No: 123501

あぁ〜本当に、質問内容や解釈がザルで申し訳ございません。
おっしゃる通りctlCommコミュニケーション (MSComm) コントロールです。

スコープに関して・・・申し訳ございません。
MSCommのオブジェクト名をctlCommとした、という事ですが、
範囲内なのか範囲外なのかの判断が付きません。
名前の付け方もご指摘のようにしてみます。


チロル  2005-07-14 03:25:21  No: 123502

現在、MSCommのオブジェクト名をctlCommAとし実行してみました。
下の箇所で”コンパイルエラー  メソッドまたはデータメンバが見つかりません”
というエラーが出てしまいす。
再度どうかご教授お願いします。

Private Sub cmdSetup_Click()

    COMM_DATA.comm_port = CInt(Mid(cmbCommPort.Text, 4))
    COMM_DATA.port_speed = cmbPortSpeed.Text
    COMM_DATA.data_bit = cmbDataBit.Text
    COMM_DATA.stop_bit = cmbStopBit.Text
    
    If cmbParity.Text = "なし" Then
        COMM_DATA.parity = "N"
    ElseIf cmbParity.Text = "奇数" Then
        COMM_DATA.parity = "O"
    ElseIf cmbParity.Text = "偶数" Then
        COMM_DATA.parity = "E"
    End If
    If cmbFllow.Text = "なし" Then
        COMM_DATA.fllow = "0"
    ElseIf cmbFllow.Text = "ソフトウェア" Then
        COMM_DATA.fllow = "1"
    ElseIf cmbFllow.Text = "ハードウェア" Then
        COMM_DATA.fllow = "2"
    End If
    
    If commOpen(Me.ctlCommA) = 0 Then  ←ここでエラーです。
        MsgBox "設定完了", vbCritical, "確認画面"
    End If
    
End Sub


ねろ  2005-07-14 17:13:07  No: 123503

昨日はちょっと忙しかったので。。。。
ちょっと錯綜してきました、少し問題点を整理してみましょう。
私が2回目のレスで試したコードは、ボタン(cmdSetup)一つと
Mscomm(ctlComm)コントロール一つだけをフォームに置いて、
Form1:
Private Sub cmdSetup_Click()
    COMM_DATA.comm_port = 1
    If commOpen(ctlComm) = 0 Then
        MsgBox "設定完了"
    End If
End Sub

Module:
Public Type Comset
    comm_port As Integer
End Type
Public COMM_DATA As Comset
Public Function commOpen(ctlComm As Object) As Integer
    On Error GoTo e
    With COMM_DATA
        ctlComm.CommPort = .comm_port
    End With
    ctlComm.PortOpen = True
    commOpen = 0
    Exit Function
e:
    MsgBox (Err.Description)
    commOpen = 1
End Function
このコードは試されるとわかるのですが、問題なく実行されます。
最初に疑うのは誰も同じで、COMM_DATA のスコープですが、
Module内の宣言をコメントアウトして、Form内にPrivate で
宣言してみました。結果は、「Option Explicit」を指定しない場合は
「オブジェクトが必要です」のエラーメッセージが、「Option Explicit」を
指定した場合は、「変数が定義されていません」のエラーメッセージが出ます。
提示された「オブジェクト変数または With ブロック変数が設定されていません。」の
エラーにはなりません。
確かにcommOpen(ctlComm As Object) はレイトバインドで気持ちは悪いのですが
エラーになることは無いと思います。
>チロルさん
上のコードを試されて、もしエラーが出ないのなら、少しずつ肉付けをされれば
何が問題かわかるでしょう。


チロル  2005-07-14 19:24:59  No: 123504

ねろさん有難うございます。

アドバイスもらったように、まず新しいプロジェクトを用意し最小限の機能だけでやってみました。
結果正常に作動させることができました。言われたように、少しづつ肉付けしていくことが大切だと思いました。
結局、直接的な原因は不明なままですが、何か自分の手には負えない箇所でツジツマが合ってなかったのかもしれません。
自分の技量わきまえず、下手に流用できる部分を流用してしまったことに原因があるのかと思いました。

アドバイスを頂いた方、有難うございました。

一応、少しだけ色をつけて動作したソースを報告します。

Form1:
Private Sub cmdSetup_Click()
    With COMM_DATA
        .comm_port = CInt(Mid(cmbCommPort.Text, 4))
        .port_speed = cmbPortSpeed.Text
        .data_bit = cmbDataBit.Text
        .stop_bit = cmbStopBit.Text
        If cmbParity.Text = "なし" Then
            COMM_DATA.parity = "N"
        ElseIf cmbParity.Text = "奇数" Then
            COMM_DATA.parity = "O"
        ElseIf cmbParity.Text = "偶数" Then
            COMM_DATA.parity = "E"
        End If
    End With
    
    If commOpen(ctlCommA) = 0 Then
        MsgBox "OK"
    End If
End Sub

Module:
Type TYP_COMM_DATA ' 通信データ構造体
    comm_port As Integer
    port_speed As String
    data_bit As String
    stop_bit As String
    parity As String            ' N:なし E:偶数 O:奇数
End Type

Public COMM_DATA As TYP_COMM_DATA

Public Function commOpen(ctlCommA As MSComm) As Integer
    On Error GoTo ErrorHandle
    With COMM_DATA
        ctlCommA.CommPort = .comm_port
        ctlCommA.Settings = .port_speed + "," + .parity + "," + .data_bit + "," + .stop_bit
    End With
    ctlCommA.PortOpen = True
    commOpen = 0
    Exit Function

ErrorHandle:
    MsgBox (Err.Description)
    commOpen = 1
End Function


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

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






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