메뉴 건너뛰기

VB.NET Serial port

2013.11.04 09:56

류짜장 조회 수:3466

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 드럼 초기화 방법 [3] 류짜장 2015.09.15 341
52 [자동차] YF 2.4GDI 미션 충격(인히비터 스위치) [1] [7] file 류짜장 2015.09.10 766
51 [자동차] YF 소나타 공조기 잡소리 [6] file 류짜장 2015.08.30 1631
50 VB.NET 레지스트리 제어 류짜장 2015.03.25 319
49 몰딩 시공 자료 file 류짜장 2015.02.12 294
48 여수시 문수동 부영2차 아파트 셀프 리모델링(작업준비) 류짜장 2014.07.03 1286
47 솔내시스템 CIE-H12를 활용한 에어컨 원격제어 file 류짜장 2014.05.29 1102
» VB.NET Serial port [89] 류짜장 2013.11.04 3466
45 GPS 경위도 값을 이용한 거리 및 방위각 구하기 [10] file 류짜장 2013.04.08 2523
44 루바 자투리 활용(커피믹스 통) 류짜장 2012.04.28 977
43 OKI B430dn 프린터 드라이버 설치가 안되는 경우 file 류짜장 2012.04.19 1623
42 VB Inet 관련 참고자료 류짜장 2012.03.25 1324
41 윈도우 업데이트 안되는 경우 해결방법 류짜장 2012.01.18 1747
40 부영아파트 분양 관련 소유권 이전 등기 직접 하기 [1] 류짜장 2011.12.27 2384
39 무료백신 올레 닥터 2.0 소개 file 류짜장 2011.12.21 2848
38 KT와이브로(모다정보통신 에그)를 통한 VPN접속 장애 [3] 류짜장 2011.12.10 5229
37 CISCO RV042 / RV082 VPN Router & Iphone [1] 류짜장 2011.10.29 2235
36 Suprema BioStation 지문인식기 류짜장 2011.10.23 2651
35 [VB] Visual Basic을 이용한 IE 신뢰할수 있는 사이트 추가 류짜장 2011.06.05 3994
34 MS 윈도우 업데이트 0xC80001FE 오류코드 해결방법 류짜장 2011.04.14 3784