Skocz do zawartości

C# wyświetlanie wykresu temperatury mikrokontrolera


Imilek

Pomocna odpowiedź

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

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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.

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.