메뉴 건너뛰기

VB.NET Serial port

2013.11.04 09:56

류짜장 조회 수:4550

RS-232C SerialPort 의 데이터 수신시, 스레드 에러 대처..  | Win Form2008-07-31 오전 10:42:49
권광칠 (kkchil)  권광칠님께 메시지 보내기권광칠님을 내 주소록에 추가합니다.권광칠님의 개인게시판 가기 번호: 365  / 읽음:3,160

SerialPort의 DataReceived 이벤트에서 데이터 수신후, 폼 컨트롤에 입력시, 컨트롤의 스레드 엑세스

에러가 발생 합니다...

 

//실패 소스

Private Sub DataReceived(ByVal sender As Object,  _
                       ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
                       Handles SerialPort1.DataReceived

        Dim byteArray(SerialPort1.BytesToRead - 1) As Byte
        Dim uni As Encoding = Encoding.Unicode
        Dim ecSjis As Encoding = Encoding.GetEncoding("shift-jis")       
        SerialPort1.Read(byteArray, 0, SerialPort1.BytesToRead)

        Dim uniBytes As Byte() = Encoding.Convert(ecSjis, uni, byteArray)

 

        txtReceive.Text = uni.GetString(uniBytes)
End Sub

 

DataReceived 이벤트는 데이터가 오브젝트로 부터 수신될때 2차 스레드에서 발생되기 때문에 나타나는 현상 입니다.

 

그래서, 컨트롤을 작성한 스레드에서 호출할 필요가 있습니다.

방법은 Delegate와 Invoke 메서드를 사용하면 해결이 됩니다.

 

//성공 소스

    'Delegate 수신

    Public Delegate Sub myDelegate()

    '데이터수신
  Private Sub DataReceived(ByVal sender As Object,  _
          ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
          Handles SerialPort1.DataReceived

        '데이터 수신은 멀티 스레드에서 실행되기 때문에, Delegate를 사용해서
        '메인 스레드에서 데이터를 표시할 필요가 있습니다.
        txtReceive.Invoke(New _
                       myDelegate(AddressOf updateTextBox), _
                       New Object() {})
    End Sub


    '수신한 데이터를 텍스트박스에 저장

    Public Sub updateTextBox()

        Dim uni As Encoding = Encoding.Unicode
        Dim ecSjis As Encoding = Encoding.GetEncoding("shift-jis")

        Dim byteArray(SerialPort1.BytesToRead - 1) As Byte
 

        SerialPort1.Read(byteArray, 0, SerialPort1.BytesToRead)

        Dim uniBytes As Byte() = Encoding.Convert(ecSjis, uni, byteArray)

        Dim strGetText As String = uni.GetString(uniBytes)

        txtReceive.AppendText(strGetText)

    End Sub

 

 

수신한 데이터의 처리 루틴은  txtReceive 텍스트 체인지 이베트 함수 안에서 처리하면 에러없이,

데이터 수신후, 처리가 가능합니다.

 

 

몇개월 전에 PLC기계에서 데이터 수신 처리를 하였는데, 위 문제때문에 몇일 고생했던 기억이...^_^

데이터 인코딩 부분은 상황에 맞게 사용하시면 되겠습니다.

 

 

더운 날씨에 모두들 힘 내시고..  수고하세요~~~~^_^

 

 

 

 

 

번호 제목 글쓴이 날짜 조회 수
53 OKI B430dn 드럼 초기화 방법 [7] 류짜장 2015.09.15 437
52 [자동차] YF 2.4GDI 미션 충격(인히비터 스위치) [1] [12] file 류짜장 2015.09.10 832
51 [자동차] YF 소나타 공조기 잡소리 [10] file 류짜장 2015.08.30 1775
50 VB.NET 레지스트리 제어 [6] 류짜장 2015.03.25 370
49 몰딩 시공 자료 file 류짜장 2015.02.12 314
48 여수시 문수동 부영2차 아파트 셀프 리모델링(작업준비) [5] 류짜장 2014.07.03 1335
47 솔내시스템 CIE-H12를 활용한 에어컨 원격제어 [3] file 류짜장 2014.05.29 1148
» VB.NET Serial port [107] 류짜장 2013.11.04 4550
45 GPS 경위도 값을 이용한 거리 및 방위각 구하기 [15] file 류짜장 2013.04.08 2625
44 루바 자투리 활용(커피믹스 통) [6] 류짜장 2012.04.28 1026
43 OKI B430dn 프린터 드라이버 설치가 안되는 경우 [5] file 류짜장 2012.04.19 1690
42 VB Inet 관련 참고자료 [6] 류짜장 2012.03.25 1385
41 윈도우 업데이트 안되는 경우 해결방법 [4] 류짜장 2012.01.18 1784
40 부영아파트 분양 관련 소유권 이전 등기 직접 하기 [1] [2] 류짜장 2011.12.27 2417
39 무료백신 올레 닥터 2.0 소개 [2] file 류짜장 2011.12.21 2880
38 KT와이브로(모다정보통신 에그)를 통한 VPN접속 장애 [5] 류짜장 2011.12.10 5269
37 CISCO RV042 / RV082 VPN Router & Iphone [3] 류짜장 2011.10.29 2308
36 Suprema BioStation 지문인식기 [2] 류짜장 2011.10.23 2708
35 [VB] Visual Basic을 이용한 IE 신뢰할수 있는 사이트 추가 [2] 류짜장 2011.06.05 4016
34 MS 윈도우 업데이트 0xC80001FE 오류코드 해결방법 [2] 류짜장 2011.04.14 3804