DCC loconetをVB.NET(Visual Basic)でコントロール

Free Serial Port Monitor でシリアルを監視しながら、Loconet Test ver2.0 を動かすと、以下の様な通信を行っていました。
操作は、Power ON/Power OFF、Thrown/Closed です。





このログから、Power On は、83 7C、Power Off は、82 7D
Thrown は、BD 0A 10 58、Closed は、BD 0A 30 78 が送られているようです。

■動作確認用ソフト

単純に、データが出力できるものを作ってみました。
loconetにデータを垂れ流してるだけなので、お行儀が悪いツールです(^_^;
とりあえず、Power On/Off と Thrown/Closed ができます。

こんなツールでも、Power On/Off と Thrown/Closed の制御が簡単にできてしまいました(いいのか?)。
こんな感じで、AVR版を作っても良いのやら・・・


■ソースファイル
Imports System.IO.Ports
Imports System.Text

'シリアル通信参考サイト
'http://www.contec.co.jp/product/device/serial/application.html
'http://www.geocities.co.jp/hatanero/rs232c3.html

Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles MyBase.Load
        ComPort_textbox.Text = "COM3"
    End Sub

    Delegate Sub dlgAddText(ByVal str As String)

    Private Sub AddText(ByVal strGetText As String)
        '受信データーをテキストボックスに追加する
        TextBox1.AppendText(strGetText)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click
        Dim a() As Byte = {&H83, &H7C} 'GPC_GPON:
        SerialPort1.Write(a, 0, a.Length)
    End Sub

    Private Sub Button2_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button2.Click
        Dim a() As Byte = {&H82, &H7D} 'GPC_GPOFF:
        SerialPort1.Write(a, 0, a.Length)
    End Sub

    Private Sub Button3_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button4.Click
        'Closed/Green
        Dim c1() As Byte = {&HB0, &H2, &H10, &H5D}
        SerialPort1.Write(c1, 0, c1.Length)
    End Sub

    Private Sub Button4_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button3.Click
        '直進 Thrown/Red
        Dim c1() As Byte = {&HB0, &H2, &H30, &H7D}
        SerialPort1.Write(c1, 0, c1.Length)
    End Sub

    Private Sub Button5_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button5.Click
        If SerialPort1.IsOpen = False Then
            SerialPort1.PortName = ComPort_textbox.Text
            SerialPort1.BaudRate = 16600
            SerialPort1.Open()
            Button5.Text = "切断"

        ElseIf SerialPort1.IsOpen = True Then
            SerialPort1.Close()
            Button5.Text = "接続"
        End If
    End Sub

    Dim lByte As List(Of Byte) = New List(Of Byte)
    Private Sub SerialPort1_DataReceived(ByVal sender As Object, _
                                          ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
                                          Handles SerialPort1.DataReceived
        'データ受信用のバイト配列
        Dim inByte(SerialPort1.BytesToRead - 1As Byte

        'データの読み込み 
        SerialPort1.Read(inByte, 0, SerialPort1.BytesToRead)

        For i As Integer = 0 To inByte.Length - 1
            Dim foo As Integer = inByte(i)

            Dim uniString As String = Convert.ToString(inByte(i), 16).ToUpper()
            uniString = uniString.PadLeft(2"0") & " " '0を補う

            'メインスレッドのテキストに追加する
            Me.Invoke(New dlgAddText(AddressOf AddText), New Object() {uniString})
        Next

        Me.Invoke(New dlgAddText(AddressOf AddText), New Object() {vbCrLf})
    End Sub
End Class

■ソースファイルのダウンロード
ダウンロード(VB.net版)

■参考
桂庵さん翻訳のLoconet規格
digitrax原文のLoconet規格

2009.05.20 初版
2009.05.24 2版