シリアル通信

' ============================================================================
' シリアル通信 サンプルプログラム
'
' <SerialCommunication.vb>
'
' Copyright (c) 2009 Servoland corporation.
' All rights reserved.
'
' 目的:
'        SerialPortクラスを用いたシリアル通信を行います。
'
' 注意:
'        使用時には実際のポート名(COM1,COM2など)および通信速度(bps)の設定を
'        行う必要があります。
'
' Version情報:                        -- 追加, 修正項目 --
'        Version 1.0        2009.08.19    : First construction.
'
' ============================================================================
Public Class SerialCommunication
    Dim TempStr As String ' 一時文字列

    Private Sub SerialCommunication_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        With SerialPort1
            .PortName = "COM1"
            .BaudRate = 1200
            .DataBits = 8
            .Parity = IO.Ports.Parity.None
            .StopBits = IO.Ports.StopBits.One
            .ReceivedBytesThreshold = 1
        End With

    End Sub

    Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
        Dim value As Char
        Dim str As String
        value = e.KeyChar

        If value = vbCr Then
            str = TextBox1.Text.ToUpper() + vbCr
            If SerialPort1.IsOpen Then
                SerialPort1.Write(str)
            End If
            TextBox1.SelectAll()
        End If
    End Sub

    Private Sub btnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOpen.Click
        If SerialPort1.IsOpen = False Then
            Try
                SerialPort1.Open()
            Catch ex As Exception
                MessageBox.Show(ex.Message, "エラー", _
                    MessageBoxButtons.OK, _
                    MessageBoxIcon.Error, _
                    MessageBoxDefaultButton.Button3)
            End Try
        Else
            MessageBox.Show("既にシリアルポートを開いています。", "エラー", _
                MessageBoxButtons.OK, _
                MessageBoxIcon.Warning, _
                MessageBoxDefaultButton.Button3)

        End If
    End Sub

    Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click
        If SerialPort1.IsOpen = True Then
            SerialPort1.Close()
        End If
    End Sub

    Private Sub SerialCommunication_FormClosed(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
        If SerialPort1.IsOpen = True Then
            SerialPort1.Close()
        End If
    End Sub

    Delegate Sub RecvDataDelegate(ByVal RecvStr As String)

    Private Sub RecvData(ByVal RecvStr As String)
        ' 受信欄更新
        TextBox2.Text = RecvStr

        ' 受信履歴更新
        RichTextBox1.Text = RichTextBox1.Text + RecvStr + vbCr

        ' 受信履歴の最下行表示
        RichTextBox1.SelectionStart = RichTextBox1.Text.Length - 1
        RichTextBox1.ScrollToCaret()
    End Sub

    Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
        Dim Recv As New RecvDataDelegate(AddressOf RecvData)
        Dim strReceived As String

        Try
            ' 受信データ読込
            strReceived = SerialPort1.ReadExisting()

            ' 受信文字列結合
            TempStr = TempStr + strReceived

            ' CR受信(受信完了)
            If strReceived(strReceived.Length - 1) = vbCr Then
                ' CR削除
                TempStr = TempStr.Remove(TempStr.Length - 1, 1)

                ' TextBox1からInvoke
                TextBox1.Invoke(Recv, TempStr)

                ' 一時文字列初期化
                TempStr = ""
            End If

        Catch ex As Exception
            MessageBox.Show(ex.Message, "受信エラー", _
                MessageBoxButtons.OK, _
                MessageBoxIcon.Error, _
                MessageBoxDefaultButton.Button3)
        End Try

    End Sub

End Class