【问题标题】:Reading Real time data from serial port从串口读取实时数据
【发布时间】:2017-09-12 23:13:36
【问题描述】:

我正在尝试从加速度计读取实时数据。加速度计的采样频率为 2650Hz。我从串口获取正确的数据,但无法与采样频率匹配。采样频率在 2100Hz 到 2400Hz 之间变化,并且不稳定。我正在使用秒表作为计时参考。

这是我接收串行数据的代码。

private void toolStripButton12_Click(object sender, EventArgs e)
{
    serialPort1.PortName = comboBox1.Text;
    serialPort1.BaudRate = Convert.ToInt32(115200);

    if (!serialPort1.IsOpen)
    {
        serialPort1.Open();
    }                    
    sw.Start();
    serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(SerialPort1_DataReceived);
}

}


private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    {
        byteCount = serialPort1.BytesToRead;
        if (byteCount > 4000)
        byteCount = 4000;

        if (e.EventType == SerialData.Eof)
        return;
        byte[] buffer = new byte[byteCount];

        int readBytes = serialPort1.Read(buffer, 0, buffer.Length);

        // FIFO Implementation

        buffer.ToList().ForEach(b => newrecievedData1.Enqueue(b));
        if (newrecievedData1.Count < 4000) return;
        processdata3();

        int i = 0;

        {
            while (i <= packet3.Length-4)
            {
                while (packet3[i++] != 69) ;

                data = packet3[i++];
                a = data << 8;
                b = a + packet3[i++];
                c = b << 8;
                d = c + packet3[i++];
                Port1data.Add(d);


                countbyte[0]++;

                tick = (double)countbyte[0];
            }
        }

        t = (double)sw.Elapsed.TotalSeconds;             
        Sampling frequency = tick / t;
    }

    try
    {
        this.Invoke(new EventHandler(DisplayText));
    }
    catch
    {
    }
}

Int32[] packet3;

private Int32[] processdata3()
{
    if (newrecievedData1.Count >= 4000)
    {
        packet3 = Enumerable.Range(0, 4000).Select(h => newrecievedData1.Dequeue()).ToArray();
    }
    return packet3;
}

我想始终准确地获得 2650 Hz 的采样频率。非常感谢任何帮助。

【问题讨论】:

    标签: c#


    【解决方案1】:

    即每个样本 0.337 毫秒。这确实推动了每个样本可以完成多少代码的上限。

    如果不对您的算法进行一些重大优化(可能使用专为您的工作负载设计的自定义集合),我认为使用托管代码无法满足您的要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多