2012-10-25 4 views
1

저는이 포럼에 처음 왔으므로 이것이 정말이 장소에 있는지 확실하지 않습니다. 필요할 경우 더 적절한 포럼으로 자유롭게 이동하십시오. 나는 VB 전송 및 직렬 장치에 HEX 데이터를 수신 2010 년 간단한 응용 프로그램을 쓰고 있어요 그래서 좋아시리얼에서 HEX 데이터 수신 및 처리


. 지금 나는 "보내는"부분을 가지고 있지만, 나는받는 부분에 어려움을 겪고있다. 이 장치는 매초마다 응용 프로그램에 HEX 데이터의 상수 스트림을 보냅니다. 받은 문자열의 특정 바이트를보고 IF 문 내에서 해당 작업을 수행 할 응용 프로그램이 필요합니다 (예 : 문자열의 10 번째 바이트가 "& 10"과 같은 경우).

이 데이터를 가져 오는 방법을 모르겠지만 올바른 바이트를 구문 분석 한 다음 그 데이터로 무언가를하십시오. 다음과 같이/I이 사용하려고했습니다 (하지만 작동하지 않습니다) 코드는 다음과 같습니다 -

Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As  System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived 
     Dim statusget() As String 
     Dim str1 As String 
     str1 = SerialPort1.ReadExisting() 
     statusget = str1.Split(",") 

    If statusget(10) = "&01" Then 
     btn_tx1.BackColor = Color.Red 
     btn_tx2.BackColor = SystemColors.Control 
     btn_tx3.BackColor = SystemColors.Control 
     btn_tx4.BackColor = SystemColors.Control 
     btn_tx5.BackColor = SystemColors.Control 
     btn_tx6.BackColor = SystemColors.Control 
     btn_tx7.BackColor = SystemColors.Control 
     btn_tx8.BackColor = SystemColors.Control 
    End If 
End Sub 

또한, 내가 표시하는 서식있는 텍스트 상자를 가지고있는 기기에서 수신 된 모든 데이터 내가 할 수있는 그렇게 그것을 모니터하십시오. 그것은 "uZ !!!"와 같은 이상한 인코딩 (16 진수가 아닌)으로 반환된다는 사실을 제외하고는 잘 동작합니다.

제공 할 수있는 도움에 감사드립니다. :)


편집 - 전송 데이터에 대한 코드 : 진수 읽기 쉽게 문자열로 이진 데이터를 포맷하는 단지 방법으로

Private Sub btn_tx1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_tx1.Click 
    Dim buftx1() As Byte = {&HF0, &H5A, &HF, &H5, &H1, &H11, &H0, &H0, &H0, &H0, &H0, &H0, &H30, &H37, &HFF} 
    SerialPort1.Write(buftx1, 0, buftx1.Length) 
End Sub 
+0

이것은 완전히 꺼져 있지만 그만한 가치가 있습니다. 그게 가능해 !!!! 16 진수 문자열을 나타냅니다. AB를 헥스로 보냈다고합시다. 그것은 문자열 결과 (ASCII)로 "V"를 제공하는 비트 단위의 01010110입니다. str1을 16 진수로 변환하면 효과가 있습니다. 가능하면 데이터를 보내는 코드를 제공하십시오. – WozzeC

+0

음 str1 변수를 16 진수로 변환하는 방법은 무엇입니까? 나는 방금 전송과 함께 게시물을 업데이 트했습니다. – logicallysynced

+0

1 : 문자열을 바이트로 변환합니다. http://www.chilkatsoft.com/faq/dotnetstrtobytes.html 2 : Bytearr을 16 진수 문자열로 바꾸십시오. http://social.msdn.microsoft.com/Forums/eu/csharpgeneral/thread/3928b8cb-3703-4672-8ccd-33718148d1e3 – WozzeC

답변

1

피가 "진수"데이터에 대한 생각 인간에 의해.

분명히, 장치가 바이너리 프로토콜을 사용하고 있습니다. 귀하의 Click 이벤트 처리기가 그 증거입니다. 이는 변함없이 텍스트가 아닌 바이너리 데이터도 반환한다는 것을 의미합니다. 그래서 SerialPort.ReadExisting()을 잘못 사용하면 텍스트를 읽습니다. 결과는 지금보고있는 쓰레기, 특히 물음표입니다. 그것들은받은 바이트를 ASCII 문자로 변환하는 방법을 모르기 때문에 생성됩니다.

대신 Byte()를 채우기 위해 SerialPort.Read()를 사용해야합니다. Read()의 반환 값에주의하십시오. 얼마나 많은 바이트가 있는지 알려줍니다. 결과는 요청한 바이트 수보다 적습니다. 프로토콜 규칙에 따라 장치에서 전체 응답을 얻을 때까지 Read()를 계속 호출하십시오.

일단 전체 응답을 얻으면 장치가 반환 한 데이터를 사용하여 처리 할 수 ​​있습니다. RichTextBox에 표시하는 것은 디버깅 목적 이외에별로 유용하지 않습니다. BitConverter.ToString (Byte()) 오버로드를 사용하여 바이트에서 16 진수 문자열을 생성 할 수 있습니다. 이벤트가 작업자 스레드에서 실행되기 때문에 UI를 직접 업데이트 할 수 없으므로 DataReceived 이벤트 처리기에서 Control.BeginInvoke()를 사용해야합니다.

프로토콜 규칙에 대한 도움이 필요하면 지원을 위해 장치 공급 업체에 문의하십시오.

+0

안녕 한스, 매우 유익한 게시자 주셔서 감사합니다. 이것은 데이터에 관해 제게 많은 것을 설명합니다. 가능하다면 예제 if 문을 포함하여 내 코드에서이 코드를 구현하는 방법에 대한 예제를 제공하는 것이 가능합니까? 내 머리는 모든 새로운 정보로 회전하고 있으며이 예를 보면이 프로세스를 더 잘 이해하는 데 매우 유용 할 수 있습니다. :) – logicallysynced

+0

게시 할 수있는 유일한 예제 코드는 잘못된 방법으로 시작하게 만들었습니다. 장치 프로토콜을 모르겠습니다. –