Laden...

Daten ablesen über seriellen Port wirft IndexOutOfRangeException

Erstellt von kingf vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.129 Views
K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 6 Jahren
Daten ablesen über seriellen Port wirft IndexOutOfRangeException

Hallo
es soll über den seriell port Daten abgelesen werden und angezeigt werden über balken daigramm echtzeit. hat bis 5 sensor gut geklappt.Ab ´5 sensor zeigt er folgenden fehler an.

das ist der code


 private void ProcessCOMRx(object sender, EventArgs e) // Auswertung der eingegangenen Daten
        {
            if (!string.IsNullOrEmpty(COMRx)) // wenn eingegangene Daten vorhanden sind:
            {
                string[] werte = COMRx.Split('\t'); // Daten in einzelne Werte teilen
                DateTime jetzt = DateTime.Now; // Aktuelle Zeit laden
                TimeSpan zsp = jetzt.Subtract(programmStart);// jetzt - programmStart

                string zeitStempel = zsp.ToString(@"hh\:mm\:ss\.fff"); // Zeitstempel erzeugen und formatieren
                richTextBox1.ScrollToCaret();// Autoscroll-Funktion
                richTextBox1.AppendText(zeitStempel + '\t' + COMRx + '\n'); // Zeitstempel und Messwert in RichTextBox einfügen
                                                                            // und neue Zeile anfangen
                if (aufnahmeAktiv) // wenn Aufnahme läuft:
                {
                    TimeSpan d = jetzt - start; // Zeitdifferenz für Aufnahmezeitstempel berechnen
                    zeit = d.TotalSeconds; // Anzahl der Skunden der Zeitdifferenz ermitteln
                    messwerte += COMRx + '\n'; // aktuelle Messwert-Reihe in "string messwerte" aufnehmen
                    messzeit += zeit.ToString("0.00", System.Globalization.CultureInfo.InvariantCulture) + '\n'; // Messzeitpunkt aufnehmen
                    if (zeit >= limit) // wenn Messzeitpunkt die festgelegte Messzeit erreicht:
                    {
                        aufnahmeBeenden(); // Aufnahme beenden
                    }
                    lblZeitJetzt.Text = zeit.ToString("0.00", System.Globalization.CultureInfo.InvariantCulture); // Zeit-Label aktualisieren
                }

                this.chart1.Series.Clear(); // chart1 leeren
                int i = 0;
                this.chart1.Series.Add("s1"); // neue Series zu chart1 hinzufügen
                foreach (string wert in werte) // für jeden Wert in "string werte"-Array:
                {
                    if (sensorAktiv[i]) // wenn der dazugehörige Sensor aktiv ist:
                    {
                        double nextX = 1;
                        if (this.chart2.Series[chart2Series[i]].Points.Count > 0) // wenn die Anzahl der Werte größer als 0 ist:
                        {
                            nextX = this.chart2.Series[chart2Series[i]].Points[this.chart2.Series[chart2Series[i]].Points.Count - 1].XValue + 1;
                                //^^ nächstn freien Punkt auf X-Achse auswählen
                        }
                        this.chart2.Series[chart2Series[i]].Points.AddXY(nextX, wert); // neuen Messwert in Diagramm von chart2 für entsprechenden
                                                                                       // Sensor einfügen
                        this.chart1.Series["s1"].Points.AddXY(i + 1, wert); // Balken für entsprechenden Messwert in chart1 einfügen
                    }
                    else // wenn der Sensor deaktiviert ist, jeweils wert 0 in entsprechenes Diagramm einfügen (wie oben)
                    {
                        double nextX = 1;
                        if (this.chart2.Series[chart2Series[i]].Points.Count > 0)
                        {
                            nextX = this.chart2.Series[chart2Series[i]].Points[this.chart2.Series[chart2Series[i]].Points.Count - 1].XValue + 1;
                        }
                        this.chart2.Series[chart2Series[i]].Points.AddXY(nextX, 0);
                        this.chart1.Series["s1"].Points.AddXY(i + 1, 0);
                    }

                    while (this.chart2.Series[chart2Series[i]].Points.Count > 200) // solange mehr als 200 werte pro sensor in chart2 sind:
                    {
                        this.chart2.Series[chart2Series[i]].Points.RemoveAt(0); // ersten Punkt des Diagramms löschen
                    }
                    double min = this.chart2.Series[chart2Series[i]].Points[0].XValue; // ersten Punkt des Diagramms ermitteln
                    foreach (System.Windows.Forms.DataVisualization.Charting.ChartArea CA in this.chart2.ChartAreas) // für jedes Diagramm in chart2:
                    {
                        CA.AxisX.Minimum = min; // Ausschnitt anpassen: Minimalwert
                        CA.AxisX.Maximum = min + 200; // Ausschnitt anpassen: Maximalwert
                    }
                    i++; // i um eins inkrementieren
                }
                COMRx = ""; // "string COMRx" leeren
            }
        }

Danke

K
kingf Themenstarter:in
28 Beiträge seit 2016
vor 6 Jahren

hier der fehler :> Fehlermeldung:

(system.index.outofrange.expection der Index ist außerhalb des Array bereich)

P
441 Beiträge seit 2014
vor 6 Jahren

Die Fehlermeldung sagt doch schon wo das Problem liegt.

Du versuchst auf einen nicht existenten Array Index zuzugreifen. Im Stack Trace der Exception steht sogar in welcher Codezeile.

5.658 Beiträge seit 2006
vor 6 Jahren

Weeks of programming can save you hours of planning