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

时间:2013-10-11 08:42:08

标签: c# plot signal-processing zedgraph data-processing

我有一个电路向我发送传感器的两个不同数据。数据以数据包的形式出现。第一个数据是“$”将一个数据包分成另一个数据包。在'$'之后,它发送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]);
                }
            }
        }

我该如何解决这个问题?

电路设置:BaudRate:38400,频率:200hz,CommunicationType:RS232。

端口设置:ReadTimeOut = 5 WrtieTimeOut = 5;

在阅读数据时,我正在使用以下代码。 Read_Data1引用数据[]上面的代码。我有一个计数器,在绘制数据之后,它的值等于零,我阻止了我的缓冲区index out of range exception

    byte[] Read_Data1 = new byte[1000];
    private void myPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        if (!myPort.IsOpen)
            return;
        if (myPort.BytesToRead > 0)
        {
            byte[] buffer = new byte[myPort.BytesToRead];
            myPort.Read(buffer, 0, buffer.Length);
            DataConversion.bytetobyte(Read_Data1, buffer, buffer.Length, count);
            count += buffer.Length;
            DataRecord.SaveBytesToFile(buffer, save.FileName);
        }
    }

    public static void bytetobyte(byte[] Storage, byte[] databyte, int datacount, int count)
    {
        int abc;
        for (abc = 0; abc < datacount; abc++)
        {
            Storage[abc + count] = databyte[abc];
        }
    }

1 个答案:

答案 0 :(得分:0)

如果没有看到数据流,很难准确理解发生了什么,但是当你乘以18时,偏移量会随着我的增加而不同。为了使它工作,你需要确保此时恰好4个数据包实际上在缓冲区中,或者事情可能会变得奇怪。与rs232连接的测量硬件一起工作了很多我经常发现他们的软件并不是那么一致,所以我要小心假设数据在那里:)

了解如何以及何时将数据读入data缓冲区,您是否确定每次调用代码时都包含新数据?

循环看起来正确但有点难以阅读,我将其重写为

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