2017-09-12 4 views
0

Ich versuche Echtzeitdaten von einem Beschleunigungsmesser zu lesen. Die Abtastfrequenz des Beschleunigungsmessers beträgt 2650 Hz. Ich erhalte korrekte Daten vom seriellen Port, kann aber nicht mit der Abtastfrequenz übereinstimmen. Die Abtastfrequenz variiert von 2100 Hz bis 2400 Hz und ist nicht stabil. Ich verwende eine Stoppuhr für die Timing-Referenz.Lesen von Echtzeitdaten von der seriellen Schnittstelle

Hier ist mein Code für den Empfang von seriellen Daten.

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

Ich möchte genau 2650 Hz Sampling Frequenz die ganze Zeit bekommen. Jede Hilfe wird sehr geschätzt.

Antwort

0

Das ist 0,337 ms pro Probe. Das treibt die Obergrenzen dafür, wie viel Code pro Sample gemacht werden kann.

Ohne eine wesentliche Optimierung Ihrer Algorithmen (möglicherweise mit benutzerdefinierten Sammlungen, die speziell für Ihre Arbeitslast entwickelt wurden), sind Ihre Anforderungen mit verwaltetem Code nicht erreichbar.

Verwandte Themen