我正在尝试绘制实时数据。一个电路快速发送数据,我知道第一个字节是“$”,接下来的 16 个字节是声音,最后一个字节是脉冲传感器数据。我正在使用一种将数据存储到数组的方法,它从最后一个索引。
byte[] Read_Data1 = new byte[100000];
byte[] Read_Data2 = new byte[100000];
byte[] Read_Data3;
private void myPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    if (!myPort.IsOpen)
    return;
    while (myPort.BytesToRead > 0)
    {
        int bytes = myPort.BytesToRead;
        byte[] buffer = new byte[bytes];
        myPort.Read(buffer, 0, bytes);
        bytetobyte(Read_Data1, buffer, buffer.Length, count);
        count += buffer.Length;
    }
}
public void bytetobyte(byte[] Storage, byte[] databyte, int datacount, int count)
{
    //count comes from count += buffer.Lenght
    int abc;
    for (abc = 0; abc < datacount; abc++)
    {
        Storage[abc+count] = databyte[abc];
    }
}
然后我开始使用一种适用于计时器滴答声的方法来处理数据。我应该删除第一个字节'$'并且需要将 16 个字节保存到一个列表和 1 个字节到另一个列表。这是方法:
byte[] Read_Data3;
LinkedList<byte> data;
public void DrawingAudioData(byte[] data) //This method works inside timer.
{
    Read_Data2 = Read_Data1;
    int lastCount = count;
    int division = count / 18;
    int remaning = (count - 18 * division);
    Read_Data3 = new byte[count - remaning];
    for (int i = 0; i < count - remaning ; i++)
    {
        Read_Data3[i] = Read_Data2[i];
    }
    count = 0;
    IPointListEdit listAuido = curveAudio.Points as IPointListEdit;
    IPointListEdit listPulse = curvePulse.Points as IPointListEdit;
    XDate time = new XDate(DateTime.Now);
    if (Read_Data3 == null)
    return;
    data= new LinkedList<byte>(Read_Data3);
    if(data.First == null)
    return;
    if (data.Count >= 18 & data.ElementAt(0) == Convert.ToByte('$'))
    {
        data.Remove(veri.ElementAt(0));
        for (int x = 0; x < 16; x++)
        {
            listAuido.Add(time, data.ElementAt(0));
            data.Remove(data.ElementAt(0));
        }
        listPulse.Add(time, data.ElementAt(0));
        data.Remove(data.ElementAt(0));
    }
    lastCount = 0;
}
我认为当计时器滴答时我应该有一个新字节,因为串行端口快速发送数据并且数据在 Read_Data1 内部发生更改。之后,我将计数归零。因为数据仍在流动,我不想让我的数组超出范围。然后我开始处理新的 Read_Data2。正如我之前所说,我必须处理每 18 个字节,所以我修剪了 Read_Data2 并删除了剩余的最后几个数据,然后我均衡Read_Data3[i]=Read_Data2[i];了然后使用LinkedList包括 Read_Data3,我尝试编写一个循环,在将第一个数据填充到列表后将其删除。处理完 LinkedList 后,lastCount 等于 0,因为我应该根据新的数据集设置一个新的大小。看起来逻辑是正确的,但我有一个问题。有时脉搏传感器数据会列在音频数据中。我的意思是数据应该在 listPulse 中,但它会进入 listAudio。
首先我想知道方法是正确的方法。我的意思是使用计时器是快速数据的好主意?请分享您的意见。如果您有更好的方法,请告诉我或提供参考文章或示例链接。谢谢你。