Serial port 字节流中数据包的标识

Serial port 字节流中数据包的标识,serial-port,checksum,packet,serial-communication,Serial Port,Checksum,Packet,Serial Communication,我和加速计传感器的通信有点问题。传感器每秒连续输出约8000个读数。传感器通过适配器插入usb端口,显示为com4。我的问题是,我似乎无法从字节流中找出读取数据包的传感器。数据包大小为5个字节,格式如下: High nibble Low nibble Byte 1 checksum, id for packet start X high Byte 2 X mid

我和加速计传感器的通信有点问题。传感器每秒连续输出约8000个读数。传感器通过适配器插入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
十、 y,z是加速度

在传感器的文档中,它指出第一个字节中的高半字节是校验和(计算出的Xhigh+Xlow+Yhigh+Ylow+Zhigh+Zlow),但也是数据包开始的标识。我对针对外部设备编程非常陌生,无法真正理解如何将校验和用作包开始的标识符(校验和不是一直在变化吗?)。这是识别数据包开头的常用方法吗?有人知道如何解决这个问题吗


任何帮助都将不胜感激。

您需要做的是在项目中使用c#import获得一些免费的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());
       }
     }
   }
。。。无法真正理解如何将校验和用作包开始的标识符(校验和是否会一直更改?)

是的,校验和将更改,因为它是从数据派生的。
但即使包半字节的固定值开始(本身)也不足以(最初)识别(或验证)数据包。因为这是二进制数据(而不是文本),所以数据可以采用与包的任何固定值开始相同的值。如果对这个起始半字节进行简单的扫描,那么该算法很容易将一个数据半字节误识别为起始半字节

这是识别数据包开头的常用方法吗

没有,但考虑到高数据速率,这似乎是一种最小化数据包大小的方案

有人知道如何解决这个问题吗

您可能首先必须一次扫描五个字节的每个序列(即数据包帧的长度)。
计算此帧的校验和,并将其与第一个半字节进行比较。
匹配表示您(可能)有帧对齐。
不匹配意味着您应该丢弃第一个字节,并测试下一个可能的数据包帧,该帧将以第二个字节开始(即,移动剩余的4个字节并附加新的第5个字节)


一旦实现(或假设)帧对齐,您需要持续验证每个数据包的校验和,以确认数据完整性并确保帧对齐。任何校验和错误都应强制进行另一次查找以获得正确的帧对齐(从当前数据包的第2个字节开始)

这些是什么样的包?UDP?TCP?还是哪一个?@J.Davidson一定是其中之一。可以从外部设备读取字节块吗?5字节/包,8000/秒=40Kb/秒,您需要400000的波特率,而不是标准的问题COM设置。它是8192个采样/秒,buad速率设置为921600bps(根据手册)。我不确定UDP、TCP,我是通过C#net中的com端口类读取的。您是否观察到第一个字节中的
低位半字节?可能是id吗?你认为OP在读取数据或解释数据方面有问题吗。我在评论中看到
我已经观察到了半字节(全部),但我找不到任何一个保持不变的
是的,我似乎能够读取数据,但我无法正确解释它。明天我将尝试你的代码,并将其与我的结果进行比较。