2010-04-26 4 views
2

직렬 포트에서 데이터를 읽습니다. 나는이 글을 읽었다 : http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/a709d698-5099-4e37-9e10-f66ff22cdd1e직렬 포트에서 읽을 때 인코딩을 적용하는 방법

그는 내가 겪어 본 많은 이슈에 대해 글을 쓰고있다.하지만 글을 쓸 때는 System.Text.Encoding.GetEncoding ("Windows-1252")를 사용한다. 내가 가지고있는 문제는 이것을 적용하는시기와 방법입니다. 내 견해로는 세 가지 사실이 있습니다.

private SerialPort comport = new SerialPort(); 

이벤트 핸들러 :

comport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); 

또는 데이터를 읽을 때 :

string data = comport.ReadExisting(); 

내가 추가 아무리을 직렬 포트 개체 정의됩니다. 나는 실수를하는 것 같다. Encoding은 어떻게 사용합니까?

답변

4

대신 ReadExisting를 사용하는 경우 다음과 같이 바이트를 얻을 다음 원하는 인코딩 된 문자열로 변환하는 포트의 Read 방법을 사용하십시오

void port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    SerialPort port = (SerialPort)sender; 
    byte[] data = new byte[port.BytesToRead]; 
    port.Read(data, 0, data.Length); 
    string s = Encoding.GetEncoding("Windows-1252").GetString(data); 
} 

업데이트 :가 여기에 간단, 아직도 - João의 답변에 기반한 C# -2.0 친숙 버전. 당신이 당신의 SerialPort 객체를 생성 한 후, 그 Encoding 특성과 같이 설정 : 그런 다음 DataReceived 방법이된다

port.Encoding = Encoding.GetEncoding("Windows-1252"); 

그냥이 :

주앙 @
void port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    SerialPort port = (SerialPort)sender; 
    string s = port.ReadExisting(); 
} 
+0

이 메서드는 이벤트 처리기로도 작동합니까? 지금 당장 직렬 포트를 인스턴스화하고 이벤트 핸들러를 생성하기 때문에. 해당 이벤트 처리기는 ReadExisting이 포함 된 메서드를 호출합니다. 이 방법은 어떻게 적합할까요? – rross

+0

@rross : 예,이 방법은 기존 port_DataReceived 메소드를 대체합니다. 이는 사실상 다른 답변과 같은 해결책입니다. 단,이 방법은 이전에 설정된 기본 인코딩에 의존하는 것이 아니라 매번 원하는 인코딩을 사용합니다. 하나는 6 분의 1, 다른 하나는 6 분의 1입니다 :) – MusiGenesis

+1

플러스, 다른 대답은 컴파일되지 않습니다. :) – MusiGenesis

8

데이터를 보내거나 받기 전에 적절한 인코딩을 설정해야 생성자를 선택하는 것이 좋습니다.

var sp = new SerialPort 
{ 
    Encoding = Encoding.GetEncoding("Windows-1252") 
}; 

여전히 문제는 데이터가 있습니다 ("윈도우 1252") 지정된 인코딩에있는 시리얼 포트로 전송되고 있는지 확인하기 위해 필요한이 후 데이터를 수신하는 경우

.

+0

: 당신의 대답은 (는 C# 3.0 기능에 의존 I 및 'new SerialPort' 후에도 괄호가 필요하다고 생각합니다. 그러나 확실하지 않습니다.) C#의 최신 버전을 작성하는 것은 실제로 공정한 게임이지만, Asker가 그런 일이 발생하지 않는다면, 오. 내 집에 C# 2.0이 있기 때문에 제 대답은 작동했습니다 (그리고 당신의 컴파일은 컴파일되지 않았습니다). – MusiGenesis

+0

+1 더 좋고 더 간단한 방법이기 때문에 어쨌든 +1하십시오. – MusiGenesis

관련 문제