프로그래밍 노트

VB.NET에서 시리얼 통신하는 정말 간단한 예제 본문

비주얼 베이직

VB.NET에서 시리얼 통신하는 정말 간단한 예제

띠리 2007. 6. 18. 13:58

VB.NET에서 시리얼 통신하는 정말 간단한 예제
VB.NET은 해본적이 없어서 아직 아는게 별로 없다.
오늘 처음으로 Delgate라는 것을 봤다.
Invoke도 그렇고...

잘은 모르겠지만 예전에 VB6에서는 메세지 박스가 떠있으면
컨트롤은 다른 이벤트가 발생하지 않았다.
그런데 Delgate와 Invoke를 쓰면 메세지 박스가 떠있더라도
메세지를 받을 수 있다.


Imports System.IO.Ports    ' Serial 통신용

Imports System.Threading    ' 쓰레드용


Public Class frmMain


    Private WithEvents ComPort As New System.IO.Ports.SerialPort


    ' Delegate : 대리자를 선언하는 데 사용한다.

    ' 대리자는 형식의 Shared 메서드 또는 개체의 인스턴스 메서드를

    ' 참조하는 참조 형식이다.

    ' 이 대리자 클래스의 인스턴스를 만들기 위해 매개 변수 형식 및

    ' 반환 형식이 일치하는 모든 프로시저를 사용할 수 있다.

    ' 이러한 프로시저는 대리자 인스턴스를 통해 나중에 호출될 수 있다.


    Delegate Sub AddMessageDelegate(ByVal str As String)


    ' 컴포트 열기

    Private Sub cmdConnect_Click(ByVal sender As System.Object, _

                                ByVal e As System.EventArgs) _

                                Handles btnConnect.Click


        Try

            ComPort.PortName = "COM" & Trim(txtPort.Text)

            ComPort.BaudRate = 9600

            ComPort.Parity = Parity.None

            ComPort.DataBits = 8

            ComPort.StopBits = StopBits.One


            If (ComPort.IsOpen = True) Then

                MessageBox.Show(ComPort.PortName & "는 벌써 열려져 있는데...", "에러야", _

                MessageBoxButtons.OK, MessageBoxIcon.Error)

                Exit Sub

            End If


            Call ComPort.Open()


            btnConnect.Enabled = False

            btnDisconnect.Enabled = True


        Catch ErrEx As Exception


            MessageBox.Show(ErrEx.Message, "에러야", MessageBoxButtons.OK, MessageBoxIcon.Error)


        End Try

    End Sub


    ' 데이터 수신 이벤트

    Private Sub ComPort_DataReceived(ByVal sender As Object, _

                                ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _

                                Handles ComPort.DataReceived


        Dim addmsg As New AddMessageDelegate(AddressOf AddMessage)

        Dim strDataReceived As String


        Try

            ' 시리얼 통신으로 데이터 수신

            strDataReceived = ComPort.ReadLine


        Catch ex As Exception


            strDataReceived = ex.Message


        End Try


        ' Control.Invoke (Delegate)

        ' 컨트롤의 내부 창 핸들이 들어 있는 스레드에서

        ' 지정된 대리자를 실행한다.

        ' .NET Compact Framework에서 지원된다.


        txtRecv.Invoke(addmsg, New Object() {"RCV>" + strDataReceived})


    End Sub


    ' 텍스트박스 메시지 표시

    Private Sub AddMessage(ByVal str As String)


        txtSend.Text = ""

        txtRecv.Text = DateTime.Now.ToString("HH:mm:ss") + " " + _

                          str + ControlChars.CrLf + _

                          txtRecv.Text

    End Sub


    ' 문자열 송신

    Private Sub btnSend_Click(ByVal sender As System.Object, _

                                ByVal e As System.EventArgs) _

                                Handles btnSend.Click


        If (txtSend.Text.Length = 0) Then

            MessageBox.Show("송신 문자열을 입력해 줘", "에러야", _

                            MessageBoxButtons.OK, MessageBoxIcon.Error)

            txtSend.Focus()

            Exit Sub

        End If


        Try

            ' 시리얼 통신으로 데이터 송신

            ComPort.WriteLine(txtSend.Text)

            Call AddMessage("SND>" + txtSend.Text)


        Catch ErrEx As Exception


            MessageBox.Show(ErrEx.Message, "에러", _

                            MessageBoxButtons.OK, MessageBoxIcon.Error)

        End Try


    End Sub


    ' 컴포트 닫기

    Private Sub btnDisconnect_Click(ByVal sender As System.Object, _

                                ByVal e As System.EventArgs) _

                                Handles btnDisconnect.Click


        btnConnect.Enabled = True

        btnDisconnect.Enabled = False

        Call ComPort.Close()


    End Sub


    Private Sub lblTitle_DoubleClick(ByVal sender As Object, _

                                ByVal e As System.EventArgs) _

                                Handles lblTitle.DoubleClick


        MsgBox("나 메세지 박스야")


    End Sub


End Class



VB8 소스
Comments