Czytanie z portu

0

Witam.
Mam mały problemik :) otoz mam programik który czyta dane z portu COM. Przykladowy rekord wygląda tak: 1.2.3.4
Do listboxa wrzuca mi za pomocą splita, czyli 1 osobno 2 osobno itd. jako pojedyncze rekordy w listboxie, po prostu je rozdziela. Mam to zrobione mnie wiecej tak:

if (_port.IsOpen == true)
{
listBox_ostrzymane.Items.Insert(0, d[0]);
listBox_ostrzymane.Items.Insert(0, d[1]);
listBox_ostrzymane.Items.Insert(0, d[2]);
listBox_ostrzymane.Items.Insert(0, d[3]);

                    }

Problem polega na tym ze urzadzenie podlaczone pod port wysyła np taki zestaw:

C 45 867 A
1.2.3.4
5.6.7.8
9.10.11.12
13.14.15.16

gdzie kazda linijka jest nowym wyslanym przez urzadzenie rekordem. Jak widzicie pierwszy rekord jest zupelnie inny i wlasnie o niego mi chodzi, bo wtedy programik mi sie wysypuje, a chce aby ten pierwszy rekord byl zupelnie inaczej potraktowany, np wrzucony do drugiego listboxa. Czyli reasumujac, pierwszy listbox ma przejmowac rekordy od 1 do xx, a drugi ma przyjmowac rekord 0 .

POMOCYY!! chociaż proszę o wskazówki

0

Jeśli cały czas dostajesz dane w takim schemacie to nie widzę kłopotu, jest parę wyjść, zakładam że zawsze linia 0 to linia z jakimś c 45 867 A, a później dowolna ilość linii to numery oddzielone kropką

C 45 867 A
1.2.3.4
5.6.7.8
9.10.11.12
13.14.15.16

Wyjście numer 1
W klasie SerialPort, najpierw użyj metody** ReadLine() **- odczytasz pierwszą linię, a następnie pobierz wszystko co jest w bufforze za pomocą ReadExists()

Wyjście numer 2
Domyślam się, że Split() robisz na znaku . (kropki) Zamiast tego zrób może najpierw split na ** \n** - znak końca lini, bądź \n\r - znak końca linia i powrotu karetki, dzięki temu otrzymasz tablicę taką jak wyżej, ale wiesz że musisz ominąć 0 element (z kodem) a od 1 wzwyż zrobić Split na . (kropkę)

0
tomkos napisał(a)

Jeśli cały czas dostajesz dane w takim schemacie to nie widzę kłopotu, jest parę wyjść, zakładam że zawsze linia 0 to linia z jakimś c 45 867 A, a później dowolna ilość linii to numery oddzielone kropką

C 45 867 A
1.2.3.4
5.6.7.8
9.10.11.12
13.14.15.16

> 
> **Wyjście numer 1**
> W klasie **SerialPort**, najpierw użyj metody** ReadLine() **- odczytasz pierwszą linię, a następnie pobierz wszystko co jest w bufforze za pomocą **ReadExists()**
> 
> **Wyjście numer 2**
> Domyślam się, że **Split()** robisz na znaku . **(kropki)** Zamiast tego zrób może najpierw split na ** \n** - znak końca lini, bądź **\n\r** - znak końca linia i powrotu karetki, dzięki temu otrzymasz tablicę taką jak wyżej, ale wiesz że musisz ominąć 0 element (z kodem) a od 1 wzwyż zrobić **Split** na **.** (kropkę)



Tylko jak oddzielic rekordy ? gdyby to szlo do tempa to wtedy spokojnie mozna oddzielic 0 od reszty, ale bierzacy rekord jest ciagle pierwszym rekordem, czyli (urzadzenie wysyla>program czyta> wrzuca do listboxa) i kolejne rekordy tez tak są. Wiec to by musialo byc cos na zasadzie pierwszy rekord po rozpoczeciu odczytu, bo inaczej nie ma mozliwosci rozroznienia ktory jest 0 a ktory 1 lub 2
0

pierwszy odczyt - C 45 867 A
drugi odczyt - 1.2.3.4
trzeci odczyt -5.6.7.8
czwarty odczyt - 9.10.11.12
piąty odczyt - 13.14.15.16

Nie wiem jak odczytujesz dane ale...

W takim wypadku możesz zrobić metodę która otwiera port, oraz od razu odczytuje pierwszą linię(pierwszy odczyt), następnie zostanie uruchomiona w timerze jakaś druga metoda, która co określony czas odczytuje zestaw danych, już wiesz że ten pierwszy się nie pojawi...

Ewentualnie jeśli odczyt jest w timerze, możesz wprowadzić jakąś inkrementującą(do 2) się zmienną która sprawdza numer odczytu, bądź sposób lepszy, jak zauważyłeś pierwsza linia jako jedyna nie zawiera znaku . (kropka) możesz użyć metody Contains, która zwraca true jeśli dany znak wystąpi w stringu.

0
tomkos napisał(a)

pierwszy odczyt - C 45 867 A
drugi odczyt - 1.2.3.4
trzeci odczyt -5.6.7.8
czwarty odczyt - 9.10.11.12
piąty odczyt - 13.14.15.16

Nie wiem jak odczytujesz dane ale...

W takim wypadku możesz zrobić metodę która otwiera port, oraz od razu odczytuje pierwszą linię(pierwszy odczyt), następnie zostanie uruchomiona w timerze jakaś druga metoda, która co określony czas odczytuje zestaw danych, już wiesz że ten pierwszy się nie pojawi...

Ewentualnie jeśli odczyt jest w timerze, możesz wprowadzić jakąś inkrementującą(do 2) się zmienną która sprawdza numer odczytu, bądź sposób lepszy, jak zauważyłeś pierwsza linia jako jedyna nie zawiera znaku . (kropka) możesz użyć metody Contains, która zwraca true jeśli dany znak wystąpi w stringu.

Pierwsza linia zmienia się tylko numerami, zawsze jest w niej na poczatku C, wiec moze dac
while(s.Contains("C")) - wstaw w drugiego listboxa
lub ew:

for (licz = 0; licz < 1; licz++)
{
if (_port.IsOpen == true && s != "" && s.Contains("."))
{
listBox_ostrzymane.Items.Insert(0, d[0]);
listBox_ostrzymane.Items.Insert(0, d[1]);
listBox_ostrzymane.Items.Insert(0, d[2]);
listBox_ostrzymane.Items.Insert(0, d[3]);
}
}

gdzie s = _port.ReadExisting();

Dzięki wielkie za pomoc ;)))

0

Nie możesz po prostu przeczytać pierwszego wiersza w jakiś sposób, a następne w inny? Zwykły indekser (int index, który inkrementujesz po każdym wierszu) załatwi Ci sprawę...

0
ZXCZXC napisał(a)

Nie możesz po prostu przeczytać pierwszego wiersza w jakiś sposób, a następne w inny? Zwykły indekser (int index, który inkrementujesz po każdym wierszu) załatwi Ci sprawę...

To rozwiazanie jest lepsze, bo gdyby sie cos wysypalo i urzadzenie bedzie wysylac krzaki to program do wklepie tak jak pierwsza linijke, czyli w listboxa z 'komentarzem' :))
Ale zobaczymy przy dluzszym zastosowaniu, w teorii to moze byc dobre ale w praktyce po wielu probach moze sie okazać zlym pomysłem, wtedy bede musiał cos znowu pomysleć

1 użytkowników online, w tym zalogowanych: 0, gości: 1