Imilek Napisano Maj 28, 2018 Udostępnij Napisano Maj 28, 2018 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 Cytuj Link do komentarza Share on other sites More sharing options...
FlyingDutch Maj 28, 2018 Udostępnij Maj 28, 2018 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 1 Cytuj Link do komentarza Share on other sites More sharing options...
Imilek Maj 28, 2018 Autor tematu Udostępnij Maj 28, 2018 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. Cytuj Link do komentarza Share on other sites More sharing options...
FlyingDutch Maj 28, 2018 Udostępnij Maj 28, 2018 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 Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
Imilek Czerwiec 7, 2018 Autor tematu Udostępnij Czerwiec 7, 2018 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. Cytuj Link do komentarza Share on other sites More sharing options...
FlyingDutch Sierpień 9, 2018 Udostępnij Sierpień 9, 2018 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 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!