2017-09-12 63 views
0

我正在嘗試從加速計讀取實時數據。加速度計的採樣頻率爲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赫茲的採樣頻率。任何幫助都非常感謝。

回答

0

這是每個樣品0.337毫秒。這確實推動了每個樣本可以完成多少代碼的上限。

如果沒有對算法進行某些重大優化(可能使用專門爲您的工作負載設計的自定義集合),我認爲您的需求無法通過託管代碼訪問。