일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Visual Studio 2005
- 시리얼 통신
- 데이터베이스
- SDK
- Delphi
- winsock
- vb
- MySQL
- PostgreSQL
- 셋업
- 소니
- WIN32 SDK
- Visual Basic
- c#
- 입문
- 기초
- 델파이
- 초보
- VB.NET
- SQL
- 파이어버드
- 파라미터
- 인스톨
- xml
- dll
- Firebird
- 문자열
- 설치
- MFC
- 예제
- Today
- Total
프로그래밍 노트
VB.NET에서 시리얼 통신하는 정말 간단한 예제 본문
VB.NET에서 시리얼 통신하는 정말 간단한 예제
VB.NET은 해본적이 없어서 아직 아는게 별로 없다.
오늘 처음으로 Delgate라는 것을 봤다.
Invoke도 그렇고...
잘은 모르겠지만 예전에 VB6에서는 메세지 박스가 떠있으면
컨트롤은 다른 이벤트가 발생하지 않았다.
그런데 Delgate와 Invoke를 쓰면 메세지 박스가 떠있더라도
메세지를 받을 수 있다.
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 소스