C# C信号处理绘制快速数据

C# C信号处理绘制快速数据,c#,plot,signal-processing,zedgraph,data-processing,C#,Plot,Signal Processing,Zedgraph,Data Processing,我有一个电路,从传感器向我发送两个不同的数据。数据以数据包的形式出现。第一个数据是“$”以将一个数据包分隔到另一个数据包。在“$”之后,它发送16字节的麦克风数据和1字节的脉冲传感器数据。我有一个数组来存储传入的数据,在每20毫秒绘制一次数据之后,我开始从数组的零索引写入新字节。我需要使用ZedGraph将这些数据绘制成不同的图形。然而,我无法正确地分离这些数据。有时,一个或多个音频数据显示在另一个图形中。这是我的密码: for (int i = 0; i < 4; i++

我有一个电路,从传感器向我发送两个不同的数据。数据以数据包的形式出现。第一个数据是“$”以将一个数据包分隔到另一个数据包。在“$”之后,它发送16字节的麦克风数据和1字节的脉冲传感器数据。我有一个数组来存储传入的数据,在每20毫秒绘制一次数据之后,我开始从数组的零索引写入新字节。我需要使用ZedGraph将这些数据绘制成不同的图形。然而,我无法正确地分离这些数据。有时,一个或多个音频数据显示在另一个图形中。这是我的密码:

        for (int i = 0; i < 4; i++)
        {
            if (data[i * 18] == Convert.ToByte('$'))
            {
                for (int x = ((i * 18) + 1); x < ((i * 18) + 17); x++)
                {
                    listAuido.Add(time, data[x]);
                }
                for (int a = ((i * 18) + 17); a < ((i * 18) + 18); a++)
                {
                    listPulse.Add(time, data[a]);
                }
            }
        }

如果看不到数据流,很难准确地理解发生了什么,但是当你乘以18时,偏移量会随着i的增加而不同。为了实现这一点,您需要确保此时缓冲区中实际有4个数据包,否则事情可能会变得奇怪。在使用rs232连接的测量硬件进行了大量工作后,我经常发现他们的软件并不完全一致,因此我会小心地假设数据存在:

研究如何以及何时将数据读入数据缓冲区,是否确定每次调用代码时它都包含新数据

循环看起来是正确的,但它有点难读,我将它重写为

    for (int i = 0; i < 4; i++)
    {
        if (data[i * 18] == Convert.ToByte('$'))
        {
            for (int x = 0; x < 16; x++)
            {
                listAuido.Add(time, data[(i * 18) +1 + x]);
            }
            for (int a = 0; a < 1; a++) // this doesn't really need to be a loop
            {
                listPulse.Add(time, data[ ((i * 18) + 17)+ a]);
            }
        }
我查看了您添加的代码,但还不清楚第一位代码是如何被第二位代码调用的。我仍然认为缓冲区处理的某些方面导致了您的问题,但是您可以消除这一点,但使用内置在串行端口中的缓冲区,一次只使用一个字节:

while(true){  //you could do this on a separate thread or on a timer
    if(port.ReadByte() == Convert.ToByte('$')){
        for (int x = 0; x < 16; x++)
            listAuido.Add(time, port.ReadByte());
        listPulse.Add(time, port.ReadByte());
    }
}

频率为200hz,因此1秒/200hz=5ms。数据每5毫秒一次,但我每20毫秒绘制一次数据。所以我认为一定有漂移。此外,当我放置一些断点时,缓冲区的大小看起来比数据包的大小大。如果不查看您如何读取数据,很难对此进行评论,但是端口将缓冲所有进入itThx的数据,以简化我的代码。我编辑了代码以显示我是如何读取数据的。如果你能看一看,我会很高兴的。
while(true){  //you could do this on a separate thread or on a timer
    if(port.ReadByte() == Convert.ToByte('$')){
        for (int x = 0; x < 16; x++)
            listAuido.Add(time, port.ReadByte());
        listPulse.Add(time, port.ReadByte());
    }
}