Skocz do zawartości

C# wyświetlanie wykresu temperatury mikrokontrolera


Pomocna odpowiedź

Napisano

Cześć.

Miałbym problem z wyświetlaniem wykresu, do którego dane są odczytywane z pliku .txt. Do pliku .txt zapisywana jest temperatura za pomocą UART i programu napisanego przeze mnie w Visual Studio w języku C#. Niestety mój program nie działa i od dłuższego czasu stoję w miejscu. Program wygląda tak:

private void Wykres_Load(object sender, EventArgs e)
       {
           FileStream fs = new FileStream("C:\\Users\\Paweł\\Desktop\\Elektronika projekt\\Temperatura.txt", FileMode.Open, FileAccess.Read);
           try
           {
               int i = 0;
               // string[] tablica = System.IO.File.ReadAllLines("C:\\Users\\Paweł\\Desktop\\Elektronika projekt\\Temperatura.txt");
               string[] tablica;
               tablica = new string[File.ReadAllLines("C:\\Users\\Paweł\\Desktop\\Elektronika projekt\\Temperatura.txt").Length - 1];
               StreamReader sr = new StreamReader(fs);
               while (!sr.EndOfStream)
               {
                   tablica[i] = sr.ReadLine();
                   chart1.Series["Temperatura"].Points.AddXY(i,Convert.ToDouble(tablica[i]));
                   i = i + 1;
                   textBox1.Text = tablica[0];
               }
               sr.Close();


           }
           catch (Exception ex)
           {
               MessageBox.Show(null,ex.ToString()+ "Nie można odczytać danych", "Niepowodzenie", MessageBoxButtons.OK, MessageBoxIcon.Error);
           }

       }

Przez użycie try catch, wyświetla się komunikat zawarty w MessageBox.Show i wygląda on następująco:

A efekt działania programu jest następujący:

W textbox1 sprawdzałem sobie czy istnieje dany element tablicy, no i istnieje tylko ten o indeksie 0.

Nie rozumiem, dlaczego jest taki problem z indeksowaniem- według mnie, punkt powinien na osi X mieć współrzędną 0, a ma 1. Ponadto wartość się zgadza, jednak właśnie dla indeksu tablicy [0]. Największym dla mnie zaskoczeniem jest jednak, dlaczego to wykonuje się jedynie raz. Mam około 2500 tych punktów, co się dzieje, że tak to wygląda? Czy ktoś byłby w stanie mi pomóc? Program i plik .txt w załączniku.

Bardzo dziękuję za jakiekolwiek uwagi i pozdrawiam 🙂

Temperatura.txt

Projekt_apka_komputer.rar

Cześć.

Miałbym problem z wyświetlaniem wykresu, do którego dane są odczytywane z pliku .txt. Do pliku .txt zapisywana jest temperatura za pomocą UART i programu napisanego przeze mnie w Visual Studio w języku C#. Niestety mój program nie działa i od dłuższego czasu stoję w miejscu. Program i plik .txt w załączniku.

Bardzo dziękuję za jakiekolwiek uwagi i pozdrawiam 🙂

Cześć,

miałeś co drugą linię pustą w pliku z danymii nie przechodziła konwersja z napisu na Double w linii:

chart1.Series["Temperatura"].Points.AddXY(i,Convert.ToDouble(tablica[i]));

Twoim problemem jest, że transmisja przez port szeregowy po każdej linii danych wstawia ci pustą linię - musisz wyczyścić plik z danymi przed wywołaniem wykresu.

Trochę zmodyfikowałem metodę: Wykres_Load - zabezpieczenie, żeby nie wczytać więcej linii niż zadeklarowana długość tablicy.

Tutaj kod "Wykres.cs" - zmodyfikowany:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO; // Biblioteka potrzebna do zapisywania i odczytywania danych z notatnika

namespace Projekt_apka_komputer
{
   public partial class Wykres : Form
   {
       public Wykres()
       {
           InitializeComponent();
       }

       private void Wykres_Load(object sender, EventArgs e)
       {
           FileStream fs = new FileStream("D:\\Tmp\\Temperatura.txt", FileMode.Open, FileAccess.Read);
           try
           {
               int i = 0;
               int howManyLlines = File.ReadAllLines("D:\\Tmp\\Temperatura.txt").Length - 1;
               // string[] tablica = System.IO.File.ReadAllLines("C:\\Users\\Paweł\\Desktop\\Elektronika projekt\\Temperatura.txt");
               string[] tablica;
               tablica = new string[howManyLlines];
               StreamReader sr = new StreamReader(fs);
               while (!sr.EndOfStream)
               {
                   if (i >= howManyLlines) break;
                   tablica[i] = sr.ReadLine();
                   chart1.Series["Temperatura"].Points.AddXY(i,Convert.ToDouble(tablica[i]));
                   i = i + 1;
                   textBox1.Text = tablica[0];
               }
               sr.Close();


           }
           catch (Exception ex)
           {
               MessageBox.Show(null,ex.ToString()+ "Nie można odczytać danych", "Niepowodzenie", MessageBoxButtons.OK, MessageBoxIcon.Error);
           }

       }
   }
}

Jak widać wykres się rysuje:

W załączniku plik z danymi z usuniętymi pustymi liniami (otwierać w Notepad++ , jeśli otworzysz w Notepad z Windowsa będziesz miał przekłamane formatowanie).

Pozdrawiam

Temperatura.txt

  • Pomogłeś! 1

Dziękuję za pomoc. A powiedz mi proszę, czy wtedy nie jest tak, że on pobierając całą linię to wiele z tych wartości zaczytuje? Jak u Ciebie to się stało, że program wiedział, że ma pobrać 5 znaków? Ustawiłeś to jakoś? Czy właśnie funkcja ReadLine() jako tę linię traktuje właśnie jedną wartość przesłaną przez UART?

Pozdrawiam.

Dziękuję za pomoc. A powiedz mi proszę, czy wtedy nie jest tak, że on pobierając całą linię to wiele z tych wartości zaczytuje? Jak u Ciebie to się stało, że program wiedział, że ma pobrać 5 znaków? Ustawiłeś to jakoś? Czy właśnie funkcja ReadLine() jako tę linię traktuje właśnie jedną wartość przesłaną przez UART?

Pozdrawiam.

Cześć,

program po prostu w pętli (do końca pliku) czyta kolejne linie i próbuje je przekonwertować z napisu na typ Double. Robią to te dwie linie:

     tablica[i] = sr.ReadLine(); //czyta całą linię do końca
     chart1.Series["Temperatura"].Points.AddXY(i,Convert.ToDouble(tablica[i]));

Jeśli w linii byłoby więcej miejsc po przecinku to także poprawnie zostałyby skonwertowane na typ Double. Zainstaluj sobie bezpłatny edytor 'Notepad++' i włącz pokazywanie niewidocznych znaków to zobaczysz jak wygląda twój pierwotny plik z danymi. W Windows linia kończy się znakami CR+LF (powrót karetki i nowa linia).

Pozdrawiam

  • 2 tygodnie później...

Cześć.

Dziękuję bardzo za pomoc. Ale pojawił mi się jeszcze jeden problem. Z mikrokontrolera wysyłam dane w ten sposób:

size = sprintf(data, "%.2f\r\n",Wyjscie);
HAL_UART_Transmit_IT(&huart1, data, size);

W związku z tym, jak mógłbym wyedytować program w Visual studio, aby nie było linii przerwy między zapisywanymi wartościami? Próbowałem zmienić sposób wysyłania, ale niestety wówczas program nie pracuje prawidłowo, to znaczy, nie są w ogóle zapisywane te wartości.

EDIT:

Jak do tej pory zrobiłem tak:

            for (int k = 0; k < temp.Length; k++)
           {
               if (chars[k] == '.')
               {
                   chars[k] = ',';
               }

               if (chars[k] == 13)
               {
                   chars[k] =':';
               }
               wysylaj = wysylaj + chars[k];
           }

I wydaje mi się, że to działa, ale zamiast dwukropka (🙂 chciałbym dać znak pusty- aby to było "nic". Da się to jakoś zrobić? Wpisanie takiej deklaracji wystarczyło:

chars[k] ='0'

Ale jestem ciekawy czy da się jakoś podmienić dany znak na znak pusty.

Pozdrawiam serdecznie.

  • 2 miesiące później...
Dnia 7.06.2018 o 20:46, Imilek napisał:

Cześć.

Dziękuję bardzo za pomoc. Ale pojawił mi się jeszcze jeden problem. Z mikrokontrolera wysyłam dane w ten sposób:

 

Ale jestem ciekawy czy da się jakoś podmienić dany znak na znak pusty.

Pozdrawiam serdecznie.

Cześć,

a próbowałeś podmieniać na znak o kodzie ASCII 32-dziesiętnie (Hex: 20) - jest to spacja.

Pozdrawiam

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...