2013-04-23 2 views
3

가속도계 센서와의 통신에 약간 문제가 있습니다. 센서는 약 8000 회의 판독/초를 연속적으로 출력합니다. 센서는 adaper가있는 usb 포트에 연결되며 com4로 표시됩니다. 내 문제는 바이트 스트림에서 패킷을 읽는 센서를 찾아 낼 수 없다는 것입니다. 패킷은 5 바이트의 크기를 가지며 다음 형식을 갖습니다.바이트 스트림에서 패킷 식별

  High nibble      Low nibble 

Byte 1  checksum, id for packet start X high 
Byte 2  X mid       X low 
Byte 3  Y high       Y mid 
Byte 4  Y low       Z high 
Byte 5  Y mid       Y low 

X, y, z는 가속도입니다.

센서의 설명서에는 첫 번째 바이트의 상위 니블이 체크섬 (계산 된 Xhigh + Xlow + Yhigh + Ylow + Zhigh + Zlow)이며 패킷 시작의 식별도 나와 있습니다. 필자는 외부 장치에 프로그래밍하기에는 새삼스럽고 체크섬이 패키지의 시작에 대한 식별자로 어떻게 사용될 수 있는지 실제로 파악하지 못합니다 (체크섬이 항상 변경되지 않습니까?). 이것은 패킷의 시작을 식별하는 일반적인 방법입니까? 누구든지이 문제를 해결하는 방법을 알고 있습니까?

도움을 주시면 감사하겠습니다.

+0

어떤 종류의 패킷입니까? UDP? TCP? 또는 어느 것? –

+0

@ J.Davidson은 그들 중 하나 여야합니다. 외부 장치에서 바이트 블록을 읽을 수 있습니까? – I4V

+0

5 바이트/패킷, 초당 8000 = 40Kb/초, 표준 문제 COM 설정이 아닌 400000의 보오율이 필요합니다. –

답변

2

이 ... 정말 체크섬 (패키지의 시작에 대한 식별자로하지 않을 사용할 수있는 방법을 파악할 수 없어 ... 당신이 그런 짓을해야합니다 읽기 체크섬은 항상 변경됩니까?).

예, 체크섬은 데이터에서 파생되었으므로 변경됩니다.
고정 값 패킷 시작 니블만으로는 (처음에는) 데이터 패킷을 식별 (또는 확인)하기에 충분하지 않습니다. 이것은 텍스트가 아닌 이진 데이터이기 때문에 데이터는 고정 값 시작 패킷과 동일한 값을 가질 수 있습니다. 이 시작 니블에 대해 사소한 스캔을 한 경우 해당 알고리즘이 데이터 니블을 시작 니블로 쉽게 식별 할 수 있습니다.

패킷의 시작을 식별하는 일반적인 방법입니까?

아니지만 높은 데이터 전송률을 고려할 때 패킷 크기를 최소화하는 방식 인 것으로 보입니다.

누구든지이 문제를 해결하는 방법을 알고 있습니까?

처음에는 모든 패킷 시퀀스를 한 번에 5 개 (즉, 패킷 프레임 길이) 스캔해야합니다.
이 프레임의 체크섬을 계산하고 첫 번째 니블과 비교하십시오.
일치하는 부분은 사용자가 프레임 정렬을했을 수도 있음을 나타냅니다.
불일치는 첫 번째 바이트를 던져서 두 번째 바이트로 시작하는 다음 패킷 프레임을 테스트해야한다는 것을 의미합니다 (즉, 나머지 4 바이트를 이동하고 새로운 5 번째 바이트를 추가).

프레임 정렬이 완료되면 (또는 가정 된 경우) 데이터 무결성을 확인하고 프레임 정렬을 보장하기 위해 모든 패킷의 체크섬을 지속적으로 확인해야합니다. 체크섬 오류는 올바른 프레임 정렬 (현재 패킷의 두 번째 바이트에서 시작)을 강제로 수행해야합니다.

1

프로젝트에서 C# 가져 오기에서 무료 SerialPortTerminal을 얻고 이미 완료하지 않은 경우 가져 오는 모든 데이터와 패킷을 먼저 확인해야합니다. 단지보다

using System; 
    using System.IO.Ports; 
    using System.Windows.Forms; 

    namespace SPE 
    { 
    class SerialPortProgram 
    { 
     // Create the serial port with basic settings 
     private SerialPort port = new SerialPort("COM4",  9600, Parity.None, 8, StopBits.One); 

     [STAThread] 
     static void Main(string[] args) 
     { 
     // Instatiate this class 
     new SerialPortProgram(); 
     } 

     private SerialPortProgram() 
     { 
     Console.WriteLine("Incoming Data:"); 

     // Attach a method to be called when there  // is data waiting in the port's buffer 
     port.DataReceived += new   SerialDataReceivedEventHandler(port_DataReceived); 

     // Begin communications 
     port.Open(); 

     // Enter an application loop to keep this thread alive 
     Application.Run(); 
     } 

     private void port_DataReceived(object sender,  SerialDataReceivedEventArgs e) 
     { 
     // Show all the incoming data in the port's buffer 
     Console.WriteLine(port.ReadExisting()); 
     } 
    } 
    } 
+0

OP에 데이터 * 읽는 중 문제가 있거나 * 해석 중 ** 문제가 있다고 생각하십니까? 나는 코멘트에서 본다. 나는 (나는 그들 모두) 니블을 보았지만 끊임없이 남아있는 누군가를 찾을 수 없다. " – I4V

+0

그래, 나는 데이터를 읽을 수있는 것처럼 보이지만 제대로 해석 할 수 없다. 내일 코드를 사용해 내 결과와 비교해 보겠습니다. – karra

관련 문제