Serial port 字节流中数据包的标识
我和加速计传感器的通信有点问题。传感器每秒连续输出约8000个读数。传感器通过适配器插入usb端口,显示为com4。我的问题是,我似乎无法从字节流中找出读取数据包的传感器。数据包大小为5个字节,格式如下: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
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在读取数据或解释数据方面有问题吗。我在评论中看到我已经观察到了半字节(全部),但我找不到任何一个保持不变的
是的,我似乎能够读取数据,但我无法正确解释它。明天我将尝试你的代码,并将其与我的结果进行比较。