2013-04-26 7 views
0

시리얼 포트를 통해 MCU에서 라인을 읽습니다. 줄은 "OK"로 끝나는 14 자로 구성됩니다. 문자는 int로 변환 된 다음 처리됩니다.시리얼 읽기, 첫 번째 128 값만 고려하십시오

  serialPort1.DiscardInBuffer(); 
      serialPort1.DiscardOutBuffer(); 
      serialPort1.Write("d");//request line from mcu 
      Thread.Sleep(100); 
      string line = serialPort1.ReadLine(); 

      int p1_low = line[0]; 
      int p1_high = line[1]*256; 
      int p1 = p1_low + (p1_high); 
      label1.Text = "Input Sensor: " + p1_low; 

p1_low가 p1_high보다 더 자주 변화 스틱 (63) 값이 될 때까지 : 값 (INT 변환) 값이 여기에 63으로 유지 (128)보다 큰 값을 128보다 커지면 문제는 코드이다 128보다 큽니다. 문제가 될 수있는 곳은 어디입니까?

+0

3은 마법의 숫자입니다. '?'의 ASCII 코드입니다. 귀하의 MCU가 값이 127보다 큰 바이트를 보내고 있습니다. 잘못된 방법을 사용하는 것처럼 들리지만 ReadLine()은 텍스트를 읽는 데만 사용해야합니다. Read() 메서드를 사용하여 바이트를 읽습니다. 또는 바이트 대신 텍스트를 보내도록 MCU 코드를 수정하십시오. –

답변

2

변경

SerialPort1.Encoding = System.Text.Encoding.GetEncoding(28591) 

기본 인코딩으로 인코딩, 당신이 발견 한 같은과 바이트 값> 127 대체 '를?'. 인코딩 28591은 127보다 큰 바이트 값을 유지합니다.

스레드 잠자기를 .ReadLine 블록으로 사용하지 않아도됩니다.

+0

저는 MCU가 데이터를 처리하고 전송할 시간이 필요하다고 생각했습니다. –

+0

.ReadTimeout 속성이 기본값 (무한대)으로 설정되어있는 한 중요하지 않습니다. 이 설정으로 ReadLine은 SerialPort에서 라인을 수신 할 때까지 차단됩니다. – dbasnett

+0

이것은 mpu6050 및 Unity C#을 처리 할 때 내 문제를 해결했습니다. 고마워요! – PETEroid

0

7 데이터 비트를 사용하도록 설정된 것처럼 들립니다. 데이터 비트 구성 값을 8로 변경하면 256 개의 값을 모두 얻을 수 있습니다.

참조 : http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.databits.aspx

+0

설정을 살펴보면 직렬 포트가 8 비트를 받도록 설정되어 있고 값 63을 보았습니다.이 값은 패리티가 손상된 바이트를 대체하기위한 기본값입니다. 나는 다른 소프트웨어를 사용하고 있으며 올바르게 읽었습니다. 패리티는 none으로 설정됩니다. 바이트 사이에 시간을 삽입해야합니까 (mcu에서)? –

+0

문제는 인코딩입니다. 그렇습니다. 인코딩 때문에 7 비트를받습니다. 이제 문제는 인코딩을 8 비트로 설정하는 것입니다. 그렇게하는 방법? –

+0

아, 알겠습니다. 문자열이 아닌 바이트를 읽으십시오! ReadLine이 아닌'ReadBytes' –

관련 문제