Serial Port Polling und Datenverarbeitung

Ich versuche, von mehreren seriellen Schnittstellen Sensoren über Mikrocontroller auszulesen. Jeder serielle Port empfängt mehr als 2000 Messungen (jede Messung besteht aus 7 Bytes, alle in hexadezimaler Schreibweise). Und sie schießen gleichzeitig. Im Moment wähle ich 4 serielle Ports aus. Außerdem übersetze ich jede Messung in einen String und hänge sie an einen Stringbuilder an. Wenn ich mit dem Empfang der Daten fertig bin, werden sie in eine Datei ausgegeben. Das Problem ist, dass der CPU-Verbrauch mit 80% bis 100% sehr hoch ist.

Ich habe einige Artikel durchgesehen und Thread.Sleep (100) am Ende eingefügt. Es reduziert die CPU-Zeit, wenn keine Daten kommen. Ich setze auch Thread.Sleep am Ende jeder Abfrage, wenn BytesToRead kleiner als 100 ist. Es hilft nur bis zu einem gewissen Grad.

Kann jemand eine Lösung vorschlagen, um von der seriellen Schnittstelle abzufragen und Daten zu verarbeiten, die ich erhalte? Vielleicht verursacht das Anhängen jedes Mal, wenn ich etwas erhalte, das Problem?

//I use separate threads for all sensors
private void SensorThread(SerialPort mySerialPort, int bytesPerMeasurement, TextBox textBox,     StringBuilder data)
    {
        textBox.BeginInvoke(new MethodInvoker(delegate() { textBox.Text = ""; }));

        int bytesRead;
        int t;
        Byte[] dataIn;

        while (mySerialPort.IsOpen)
        {
            try
            {
                if (mySerialPort.BytesToRead != 0)
                {
                  //trying to read a fix number of bytes
                    bytesRead = 0;
                    t = 0;
                    dataIn = new Byte[bytesPerMeasurement];
                    t = mySerialPort.Read(dataIn, 0, bytesPerMeasurement);
                    bytesRead += t;
                    while (bytesRead != bytesPerMeasurement)
                    {
                        t = mySerialPort.Read(dataIn, bytesRead, bytesPerMeasurement - bytesRead);
                        bytesRead += t;
                    }
                    //convert them into hex string
                    StringBuilder s = new StringBuilder();
                    foreach (Byte b in dataIn) { s.Append(b.ToString("X") + ","); }
                    var line = s.ToString();

                                            var lineString = string.Format("{0}  ----          {2}",
                                                      line,
                                                    mySerialPort.BytesToRead);
                    data.Append(lineString + "\r\n");//append a measurement to a huge Stringbuilder...Need a solution for this.

                    ////use delegate to change UI thread...
                    textBox.BeginInvoke(new MethodInvoker(delegate() { textBox.Text = line; }));

                    if (mySerialPort.BytesToRead <= 100) { Thread.Sleep(100); }
                }
            else{Thread.Sleep(100);}

            }
            catch (Exception ex)
            {
                //MessageBox.Show(ex.ToString());
            }
        }


    }

Antworten auf die Frage(3)

Ihre Antwort auf die Frage