8章:PingPong専用Windowsプログラムとその活用

    作成2014.08.12

     7章ではPingPongの動作試験にターミナルソフトTera Termを使用しましたが、ここでは、PingPong専用 Windowsプログラムとその活用について検討します。

  1. PingPong専用Windowsプログラムのダウンロード
     完成プログラムは「40-8.zip」ファイルをダウンロードしてください。
    [40-8.zip]をダウンロードする。

     解凍するとフォルダー内にPingPongフォルダーがあります。PingPongフォルダー内にWin-PingPongとSamp_PingPongフォルダーがあります。
     Win-PingPongフォルダー内にWin-PingPong.exeとWin-PingPong.slnがあり、Win-PingPong.exeが実行ファイルです。Win-PingPong.slnはMicrosoft Visual Basic 2010 Expressで開きます。
     Samp_PingPongフォルダーにToCoNet(トコネット)のソースファイルがあります。
     \PingPong\Samp_PingPong\PingPong\Build\Samp_PingPong_PingPong_JN5164_TDBG_0_1_1.binが実行ファイルです。


  2. PingPong専用Windowsプログラムのソース
     PingPong専用Windowsプログラムは操作性よりも、コードの単純化とデバッグ性を優先しました。コードはForm.vbのみです。以下に全コードを示します。
    Imports System.IO.Ports
    
    Public Class Form1
        Delegate Sub SetTextCallback(ByVal [text] As String)
    
        Private Sub UpdateCOMPortList()
            Dim s As String
            Dim i As Integer
            Dim foundDifference As Boolean
    
            i = 0
            foundDifference = False
    
            If lstCOMPorts.Items.Count = SerialPort.GetPortNames().Length Then
                For Each s In SerialPort.GetPortNames()
                    If lstCOMPorts.Items(i).Equals(s) = False Then
                        foundDifference = True
                    End If
                    i = i + 1
                Next s
            Else
                foundDifference = True
            End If
            If foundDifference = False Then
                Exit Sub
            End If
            lstCOMPorts.Items.Clear()
            For Each s In SerialPort.GetPortNames()
                lstCOMPorts.Items.Add(s)
            Next s
            lstCOMPorts.SelectedIndex = 0
        End Sub
    
        Private Sub UpdateCOMPortList2()
            Dim s As String
            Dim i As Integer
            Dim foundDifference As Boolean
    
            i = 0
            foundDifference = False
    
            If lstCOMPorts2.Items.Count = SerialPort.GetPortNames().Length Then
                For Each s In SerialPort.GetPortNames()
                    If lstCOMPorts2.Items(i).Equals(s) = False Then
                        foundDifference = True
                    End If
                    i = i + 1
                Next s
            Else
                foundDifference = True
            End If
            If foundDifference = False Then
                Exit Sub
            End If
            lstCOMPorts2.Items.Clear()
            For Each s In SerialPort.GetPortNames()
                lstCOMPorts2.Items.Add(s)
            Next s
            lstCOMPorts2.SelectedIndex = 0
        End Sub
    
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            UpdateCOMPortList()
            UpdateCOMPortList2()
        End Sub
    
        Private Sub btnConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConnect.Click
            Try
                SerialPort1.PortName = lstCOMPorts.Items(lstCOMPorts.SelectedIndex).ToString()
                SerialPort1.Open()
    
                btnConnect.Enabled = False
                lstCOMPorts.Enabled = False
                btnClose.Enabled = True
                txtDataReceived.Clear()
                txtDataReceived.AppendText("Connected." + vbCrLf)
            Catch ex As Exception
                btnClose_Click(Me, e)
    
            End Try
        End Sub
    
        Private Sub btnConnect2_Click(sender As System.Object, e As System.EventArgs) Handles btnConnect2.Click
            Try
                SerialPort2.PortName = lstCOMPorts2.Items(lstCOMPorts2.SelectedIndex).ToString()
                SerialPort2.Open()
    
                btnConnect2.Enabled = False
                lstCOMPorts2.Enabled = False
                btnClose2.Enabled = True
                txtDataReceived2.Clear()
                txtDataReceived2.AppendText("Connected." + vbCrLf)
            Catch ex As Exception
                btnClose2_Click(Me, e)
    
            End Try
    
        End Sub
    
        Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click
            btnClose.Enabled = False
            btnConnect.Enabled = True
            lstCOMPorts.Enabled = True
            Try
                SerialPort1.DiscardInBuffer()
                SerialPort1.DiscardOutBuffer()
                SerialPort1.Close()
            Catch ex As Exception
            End Try
        End Sub
        Private Sub btnClose2_Click(sender As System.Object, e As System.EventArgs) Handles btnClose2.Click
            btnClose2.Enabled = False
            btnConnect2.Enabled = True
            lstCOMPorts2.Enabled = True
            Try
                SerialPort2.DiscardInBuffer()
                SerialPort2.DiscardOutBuffer()
                SerialPort2.Close()
            Catch ex As Exception
            End Try
    
        End Sub
     
        Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
            Try
                SetText(SerialPort1.ReadExisting())
            Catch ex As Exception
                btnClose_Click(Me, e)
            End Try
    
        End Sub
        Private Sub SerialPort2_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort2.DataReceived
            Try
                SetText2(SerialPort2.ReadExisting())
            Catch ex As Exception
                btnClose2_Click(Me, e)
            End Try
    
        End Sub
    
        Private Sub SetText(ByVal [text] As String)
            If txtDataReceived.InvokeRequired Then
                Dim d As New SetTextCallback(AddressOf SetText)
                Invoke(d, New Object() {[text]})
            Else
                txtDataReceived.AppendText(text)
            End If
        End Sub
    
        Private Sub SetText2(ByVal [text] As String)
            If txtDataReceived2.InvokeRequired Then
                Dim d As New SetTextCallback(AddressOf SetText2)
                Invoke(d, New Object() {[text]})
            Else
                txtDataReceived2.AppendText(text)
            End If
        End Sub
    
        Private Sub btnSendData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSendData.Click
            Try
                SerialPort1.Write(txtData.Text)
            Catch ex As Exception
                btnClose_Click(Me, e)
            End Try
        End Sub
    
        Private Sub btnSendData2_Click(sender As System.Object, e As System.EventArgs) Handles btnSendData2.Click
            Try
                SerialPort2.Write(txtData2.Text)
            Catch ex As Exception
                btnClose2_Click(Me, e)
            End Try
    
        End Sub
    End Class
    


  3. 操作方法
    (1)\PingPong\Samp_PingPong\PingPong\Build\Samp_PingPong_PingPong_JN5164_TDBG_0_1_1.binを無線マイコンTWE-Lite DIP (トワイライト・ディップ)とToCoStick(トコスティック)に書き込みます。(方法は7章:ToCoNet(トコネット)のソフトウエア開発環境(SDK) とPingPongの実行プログラムの書込みを参照願います。

    (2)TWE-Lite R(トワイ・ライター)に無線マイコンTWE-Lite DIP (トワイライト・ディップ)をセットしてUSBをパソコンに接続します。
    (3)ToCoStick(トコスティック)をパソコンに接続します。
    (4)「Win-PingPong.exe」をダブルクリックで起動します。
    (5)画面の左側を「COM9」にセットして、「Conect」ボタンを押します。
    (6)画面の右側を「CON8」にセットして、「Conect」ボタンを押します。
    (7)TWE-Lite R(トワイ・ライター)のリセットボタンを押します。
    (8)以下の画面から「COM9」がTWE-Lite R(トワイ・ライター)に接続されていることが確認できます。

    (9)ToCoStick(トコスティック)のリセットボタンは押せないにで、右側のSend Data テキストボックスに「t」をセットして「Send Data」ボタンを押します。
    (10)以下の画面から「COM8」がTWE-Lite R(トワイ・ライター)に接続されていることが確認できます。

    注(1)接続ポートはパソコンの構成により変化します。
    注(2)最適な接続ポートを自動認識しません。
    注(3)ToCoStick(トコスティック)が正常に接続しない場合はさしなおしが必要です。(リセットボタンが押せない)


  4. 動作解説
    **左側:TWE-Lite R(トワイ・ライター
    (1)Connected.:ポートがオープンすると表示(最適接続とはかぎりません)
    **右側:ToCoStick(トコスティック)
    (2)Connected.:ポートがオープンすると表示(同様に最適接続とはかぎりません)
    **左側:TWE-Lite R(トワイ・ライター
    (3)*** TEST-1**5555**11-ToCoNet PINGPONG SAMPLE 0.01-1 ***
    *** 810040bd ***:リセットボタンで表示
    **右側:ToCoStick(トコスティック)
    (4)# [t] --> :コマンドtを受信
    (5)tsTx.u32SrcAddr =81005e27
    tsTx.u32DstAddr=ffff
    tsTx.auData= PING: 81005E27 TEST-3-Fire PING Broadcast Message.
    :パケット送信データの一部(表示文字数制限のため一部を表示)
    **左側:TWE-Lite R(トワイ・ライター
    (6)[PKT Ad:81005e27,Ln:018,Seq:003,Lq:183,Tms:12832 "PING: 81005E27C"]
    :パケット受信データを表示
    (7)tsTx.u32SrcAddr =810040bd
    tsTx.u32DstAddr=81005e27 
    tsTx.auData= PONG: 81005E27
    :パケット送信データの一部(表示文字数制限のため一部を表示)
    **右側:ToCoStick(トコスティック)
    (8)[PKT Ad:810040bd,Ln:018,Seq:003,Lq:186,Tms:47600 "PONG: 81005E27C"]
    PONG Message from 810040bd
    :パケット受信データを表示

    **パケット通信は1往復することが確認できます。


  5. PingPong専用Windowsプログラムの活用

     シリアル通信とパケット通信の流れ例を図8-3に示します。実際のプログラムは非常に複雑で実行の流れを理解するのは容易なことではありません。
     しかし、TWE-LiteとToCoStickのプログラムの途中にシリアル送信命令をしこめば、その動作内容をパソコンで確認できます。
     このためには、TWE-LiteとToCoStickのプログラムにデバッグ用の命令をしこむ必要があります。また、パソコン側のプログラムもデバッグ内容に合わせて最適化する必要があります。

     PingPong専用Windowsプログラムは比較的単純なプログラム構造のため、プログラム変更が容易であり、パソコン側のデバッグプログラムのベースになります。


  6. 結果の検討
    (1)PingPong専用Windowsプログラムを使用すると比較的簡単にPingPongの動作確認ができる。
    (2)PingPong専用Windowsプログラムは比較的単純なプログラム構造のためプログラム変更が容易であり、パソコン側のデバッグプログラムのベースになる。




9章:App_TweLiteの修正とWin-PingPongの修正に行く。

トップページに戻る。