Identificación de paquetes en una secuencia de bytes

Estoy teniendo un pequeño problema con la comunicación a un sensor acelerómetro. El sensor produce aproximadamente 8000 lecturas / segundo continuamente. El sensor está conectado a un puerto usb con un adaper y aparece como com4. Mi problema es que parece que no puedo elegir los paquetes de lectura del sensor de la secuencia de bytes. Los paquetes tienen el tamaño de cinco bytes y tienen el siguiente formato:

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 es la aceleración.

En la documentación del sensor, indica que el nibble alto en el primer byte es la sum de comprobación (calculada Xhigh + Xlow + Yhigh + Ylow + Zhigh + Zlow) pero también la identificación del paquete de inicio. Soy bastante nuevo en la progtwigción contra dispositivos externos y realmente no puedo comprender cómo se puede usar la sum de comprobación como un identificador para el inicio del paquete (¿no cambiaría la sum de verificación todo el tiempo?). ¿Es esta una forma común de identificar el inicio de un paquete? ¿Alguien tiene alguna idea de cómo resolver este problema?

Cualquier ayuda sería muy apreciada.

… realmente no puedo entender cómo se puede usar la sum de comprobación como un identificador para el inicio del paquete (¿no cambiaría la sum de verificación todo el tiempo?).

Sí, la sum de verificación podría cambiar ya que se deriva de los datos.
Pero incluso un mordisco de inicio de paquete de valor fijo (por sí solo) no sería suficiente para (inicialmente) identificar (o verificar) paquetes de datos. Como se trata de datos binarios (en lugar de texto), los datos pueden tomar el mismo valor que cualquier inicio de paquete de valor fijo. Si realizó un escaneo trivial para este nibble de inicio, ese algoritmo podría identificar erróneamente un nibble de datos como el de inicio y mordisco.

¿Es esta una forma común de identificar el inicio de un paquete?

No, pero dada la alta velocidad de datos, parece ser un esquema para minimizar el tamaño del paquete.

¿Alguien tiene alguna idea de cómo resolver este problema?

Probablemente tenga que escanear inicialmente cada secuencia de cinco bytes a la vez (es decir, la longitud de un cuadro de paquete).
Calcule la sum de verificación de este marco y compárelo con el primer nibble.
Una coincidencia indica que usted (puede) tener alineación de marco.
Una falta de coincidencia significa que debe lanzar el primer byte y probar el siguiente marco de paquete posible que comenzaría con lo que era el segundo byte (es decir, desplazar los 4 bytes restantes y agregar un nuevo 5to byte).

Una vez que se ha alcanzado (o asumido) la alineación de ttwig, debe verificar continuamente la sum de comprobación de cada paquete para confirmar la integridad de los datos y asegurar la alineación de ttwig. Cualquier error de sum de comprobación debería obligar a otra búsqueda a una alineación de ttwig correcta (comenzando en el 2do byte del paquete actual).

Lo que necesita hacer es obtener algún SerialPortTerminal gratuito en la importación de c # en su proyecto y primero verifique todos los datos y paquetes que está obteniendo, a menos que ya lo haya hecho. Solo para leer necesitarás hacer algo como …

  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()); } } } 
Intereting Posts