VB2005のシリアル通信で


ネギ4本  2008-02-17 18:52:12  No: 138984  IP: 192.*.*.*

シリアル通信で制御しようと
Public Class RS232CForm

    Dim ADRS As Integer '後で書き付け足した場所
    Dim DT As Integer '後で書き付け足した場所


    Private Sub RS232CForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        With ComSerialPort
            .PortName = "COM4"                  '  通信ポートはCOM4
            .BaudRate = 4800                    '  通信速度は9600bps
            .DataBits = 8                       '  データ長は8ビット
            .Parity = IO.Ports.Parity.Even     '  パリティチェックなし
            .StopBits = IO.Ports.StopBits.One   '  ストップビットは1
            '  ハードウェアによるハンドシェイク
            .Handshake = IO.Ports.Handshake.None
            .RtsEnable = True                  '  RTSラインを有効にする

        End With

    End Sub

    Private Sub ConnectButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ConnectButton.Click

        Try
            '  通信ポートが開いているかどうかの判定
            If ComSerialPort.IsOpen = False Then
                '  通信ポートを開く場合の処理
                ComSerialPort.Open()            '  通信ポートを開く
                ConnectButton.Text = "通信停止"
            Else
                '   通信ポートを切断する場合の処理
                ComSerialPort.Close()           '  通信ポートを切断
                ConnectButton.Text = "通信開始"
            End If
        Catch ex As Exception
            '  通信ポートの接続・切断時のエラー処理
            MessageBox.Show(ex.Message, "接続エラー", _
                MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try

    End Sub

    Private Sub SendButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SendButton.Click

        '  通信ポートが開いているかどうかの判定
        If ComSerialPort.IsOpen Then
            Try
                '  データの送信

                ADRS = &H80 Or &H7 '後で書き付け足した場所

                ComSerialPort.WriteLine(ADRS)
            Catch ex As Exception
                '  送信エラー時の処理
                MessageBox.Show(ex.Message, "送信エラー", _
                    MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        Else
            MessageBox.Show("通信が開始されていません", "送信エラー", _
                MessageBoxButtons.OK, MessageBoxIcon.Error)
        End If

    End Sub

    '  デリゲート型の宣言
    Delegate Sub RecieveDataDelegate(ByVal RecieveData As String)


    '  デリゲート型のプロシージャを宣言
    Private Sub SetRecieveData(ByVal DataString As String)

        RecieveDataTextBox.Text &= DataString

    End Sub

    '  SerialPortコントロールのDataReceivedイベントハンドラ
    Private Sub ComSerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles ComSerialPort.DataReceived

        Dim RecieveData As String
        '  デリゲート型の変数の宣言と生成
        Dim recieve As New RecieveDataDelegate(AddressOf SetRecieveData)

        Try
            '  データの受信
            Dim D1 As Integer
            DT = &H10 Or D1
            D1 = 0

            RecieveData = ComSerialPort.ReadLine
        Catch ex As Exception
            '  受信エラー時の処理
            RecieveData = ex.Message
        End Try


        'デリゲート型のプロシージャを呼び出す
        Invoke(recieve, RecieveData)

    End Sub

End Class

っというコードをかきました。
送信ができているんですが何も表示されません。
どういうふうにしたら表示できるかご教授を願いします。

自分ではもうわかりません

編集 削除
我龍院  2008-02-18 08:07:26  No: 138985  IP: 192.*.*.*

>.Parity = IO.Ports.Parity.Even     '  パリティチェックなし
パリティが偶数になっていますが。(^^;

編集 削除
ネギ4本  2008-02-18 16:21:57  No: 138986  IP: 192.*.*.*

ありがとうございます。
Public Class RS232CForm

    Dim ADRS As Integer '後で書き付け足した場所
    Dim DT As Integer '後で書き付け足した場所


    Private Sub RS232CForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        With ComSerialPort
            .PortName = "COM4"                  '  通信ポートはCOM4
            .BaudRate = 4800                    '  通信速度は4800bps
            .DataBits = 8                     '  データ長は8ビット
            .Parity = IO.Ports.Parity.None     '  パリティチェック偶数
            .StopBits = IO.Ports.StopBits.One   '  ストップビットは1
            '  ハードウェアによるハンドシェイク
            .Handshake = IO.Ports.Handshake.None
            .RtsEnable = True                  '  RTSラインを有効にする

        End With

    End Sub

    Private Sub ConnectButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ConnectButton.Click

        Try
            '  通信ポートが開いているかどうかの判定
            If ComSerialPort.IsOpen = False Then
                '  通信ポートを開く場合の処理
                ComSerialPort.Open()            '  通信ポートを開く
                ConnectButton.Text = "通信停止"
            Else
                '   通信ポートを切断する場合の処理
                ComSerialPort.Close()           '  通信ポートを切断
                ConnectButton.Text = "通信開始"
            End If
        Catch ex As Exception
            '  通信ポートの接続・切断時のエラー処理
            MessageBox.Show(ex.Message, "接続エラー", _
                MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try

    End Sub

    Private Sub SendButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SendButton.Click

        '  通信ポートが開いているかどうかの判定
        If ComSerialPort.IsOpen Then
            Try
                '  データの送信

                ADRS = &H80 Or &H7 '後で書き付け足した場所

                ComSerialPort.WriteLine(ADRS)
            Catch ex As Exception
                '  送信エラー時の処理
                MessageBox.Show(ex.Message, "送信エラー", _
                    MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        Else
            MessageBox.Show("通信が開始されていません", "送信エラー", _
                MessageBoxButtons.OK, MessageBoxIcon.Error)
        End If

    End Sub

    '  デリゲート型の宣言
    Delegate Sub RecieveDataDelegate(ByVal RecieveData As String)


    '  デリゲート型のプロシージャを宣言
    Private Sub SetRecieveData(ByVal DataString As String)

        RecieveDataTextBox.Text &= DataString '受信したデータをtextboxに書き込む

    End Sub

    '  SerialPortコントロールのDataReceivedイベントハンドラ
    Private Sub ComSerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles ComSerialPort.DataReceived

        Dim RecieveData As String
        '  デリゲート型の変数の宣言と生成
        Dim recieve As New RecieveDataDelegate(AddressOf SetRecieveData)

        Try
            '  データの受信
            Dim D1 As Integer
            DT = &H10 Or D1
            D1 = 0

            RecieveData = ComSerialPort.ReadLine
        Catch ex As Exception
            '  受信エラー時の処理
            RecieveData = ex.Message
        End Try


        'デリゲート型のプロシージャを呼び出す
        Invoke(recieve, RecieveData)

    End Sub

End Class

USB-RSAQ5をつかってブルーボックスとシリアル通信をしようとしています。
まだできません。どなたかご教授お願いします。

編集 削除
うに  2008-02-18 17:50:53  No: 138987  IP: 192.*.*.*

Visual Basic 掲示板
でVISTAでUSB-RSAQ5が使えなくてメーカーに連絡して
最新ドライバをもらったという話がありました。
もしOSがVISTAなら一度確認してみては?

気になったところ
相手に送信するコマンドならば
ADRS = Chr(&H80) & Chr(&H7)
ではないですか?
PC      -> &h80 &h07
BLUEBOX -> &h06
とかそういうプロトコルでは?

送信に制御コード使っているのであれば
受信にも含まれているでしょうから表示可能な
文字に変換してからでないと正しく表示できないと
思います。

#ところでブルーボックスとは何をする機器でしょうか?
#型番とかはありませんか?(Googleで調べられませんでした)

編集 削除
K.M  2008-02-20 09:55:00  No: 138988  IP: 192.*.*.*

1回目
.Parity = IO.Ports.Parity.Even     '  パリティチェックなし
2回目
.Parity = IO.Ports.Parity.None     '  パリティチェック偶数

なんで実装とコメントが逆になるんだろう?

>送信ができているんですが何も表示されません。
ヘキサで表示してみたら

編集 削除
ネギ4本  2008-02-21 17:24:50  No: 138989  IP: 192.*.*.*

うにさんありがとうございます。
>受信にも含まれているでしょうから表示可能な文字に変換してからでないと正しく表示できないと思います。
初心者でまだ勉強不足のせいかやりかたがわかりません。教えていただけませんか??

K.Mさんありがとうございます。
ちょっと書き間違えました。
ヘキサのやりかたをおしえていただけませんか??

編集 削除
我龍院  2008-02-22 16:57:01  No: 138990  IP: 192.*.*.*

RecieveDataTextBox.Text &= DataString
でブレークをかけて止まるか否かです。
止まらなければ何も送られてきていませんから、
どの様に表示しても同じです。
先ずどの様なデーターが返って来るのを期待しているか
書くべきですね。

それと
>ADRS = &H80 Or &H7 '後で書き付け足した場所
>ComSerialPort.WriteLine(ADRS)
ORはビット演算子なので普通はこういう風には使わない、
ADRS = Chr(&H80) & Chr(&H7)
これの間違では無いかと聞かれていますがどうなのですか?

>送信ができているんですが何も表示されません。
なぜ送信が出来ていると思われるのですか?
 
.Parity = IO.Ports.Parity.None     
こういった設定さえ間違わなければ、コード自体は間違えは
有りませんので通信は出来るはずです。

ドライバーの不具合を疑うなら、ループバックを言う方法で
チェックします。

編集 削除