Transfer danych przez port szeregowy

0

Witam

Otóż mam pewien problem . Aktualnie piszę program który przesyła pakiet danych przez port szeregowy które następnie "obrabia" mikrokontroler , problemem okazało się ,że dane jednak beda musiały być buforowanie i "obrabiane "częściowo . Teraz do sedna :

Myślałem ,żeby zrobić tak ,ze po odebraniu i przetworzeniu danej kontroler odpowiadał jednym bajtem potwierdzając gotowość do przyjęcia następnej porcji . Mozna prosić o sugestie jak rozwiązać to w C# ? jestem nowicjuszem w tym jezyku i próbowałem zrobić tak ,ze w obsludze przycisku program pauzować jako : while(!Potwierdzenie) ; no ale później dowiedziałem sie , że chyba cos takiego nie przejdzie ( w sensie przy odebranej danej , program samoczynnie nie opusci tego miejsca do obslugi innego ? )

Za wszelka pomoc , stokroc dzieki

0

hej..Od razu pomoc nie moge ..ale mam gdzies na dyskuprogramik zjakiegos tutoriala ktory steruje wyswietlaczem LCD 2x16.. z roznymi funckami tzn ( na formie ustawia sie dane(osobno na 1 i 2 linie, kontrast itp.) jak bede mial pozniej chwilke czsu (dzisiaj ) to rozpracuje ten kod i ci dam wskazowki..albojakos przekaze ci ten program z kodem potzrebny mail - najwsyzej napisz na moje gg

0

Dzięki za odpowiedź.

A w jaki sposób mogę uzyskać Twój numer gg ? Bo w profilu nie widzę.
Sama transmisja pomiędzy kontrolerem jest gotowa . Właśnie cholera problemem jest to , ze dane do mikrokontrolera potrzebne by przesłane były możliwe jak najszybciej najlepiej z ok. 500kbps tylko później jest problem z tym obrabianiem ( a wewnętrznej pamięci Flash nie starcza ,żeby buforować całą paczkę danych ) .

Wiec zdaje się ,ze istnieją tylko dwa rozwiązania :

  1. Wysylac partiami i potwierdzać
  2. Wysyłać ciągle , sam miktrokontroler częstować z 16 Mhz i obrabiać na bieżąco.
  3. .... ?

I tu potrzebuje wsparcia . Ktora metodę zastosować , jeśli punkt pierwszy to jak to wykonać najlepiej . Moze nie potwierdzac a watek na chwile pauzować ?

0

gg mam uz ustawione jak cos :) a te dane sa dlugie.. moze pomysl o dodatkowym flashu..bo rouzmiem ze korzystasz tylko z wewnetrznego w uc...

0

Nie jestem elektronikiem (mam za to kumpla, który nie umie przestać o tym mówić, nie zwracając uwagi na to, że nie rozumiem nawet połowy słów ;) ) i nie wiem co dokładnie ma robić Twój program, ale pomysł z wysyłaniem ciągłym wydaje się raczej zawodny i bez możliwości kontroli.

Ja bym to widział tak - dane do obrabiania podzielone są na pakiety i umieszczone w jakiejś kolekcji, np. kolejce. Pakiet jest wysyłany, mikrokontroler go odbiera, przetwarza i wysyła odpowiedź. Komponent SerialPort ma zdarzenie DataReceived, które obsługujesz, dzięki temu w momencie odebrania odpowiedz z portu wiesz, czy możesz wysyłać następny pakiet.

0

Dzięki za odpowiedzi !

A więc samo obrabianie nie jest za specjalnie skomplikowane ( najwiecej czasu zajmuje definitywnie obsługa headera , bo to głównie na nim dokonywane są najcięższe obliczenia - czyli pierwszych x-dziesiąt bajtów) . Później po prostu przesyła sie poprzez port SPI ( jest to szybka transmisja szeregowa ) , do innych urządzonek które się tym już bawią ( główny mikrokontroler już jest zwolniony ) .

Można byłoby zrobić tak jak pisałeś o potwierdzeniu ale trzeba też uruchomić dodatkowy licznik który będzie nam odmierzał jakiś czas do którego mikrokontroler musi odpowiedzieć , bo inaczej zwiesilibyśmy wątek prawda ? I tutaj już nie bardzo wiem jak takie dwa boczne wątki miałyby się między sobą komunikować

0
MarcinP napisał(a)

Można byłoby zrobić tak jak pisałeś o potwierdzeniu ale trzeba też uruchomić dodatkowy licznik który będzie nam odmierzał jakiś czas do którego mikrokontroler musi odpowiedzieć , bo inaczej zwiesilibyśmy wątek prawda ?

No chyba nie...
Po co wątek i licznik - wystarczą zdarzenia. Używasz komponentu SerialPort, obsługujesz w nim zdarzenie DataReceived. Żaden wątek się nie zawiesza - po prostu czeka sobie aż obiekt portu wywoła zdarzenie, dokładnie tak jak czeka np. na to, że użytkownik wciśnie przycisk.

0

Rozumiem . Z licznikiem to byłoby jedynie zabezpieczenie gdyby podczas transmisji np. mikrokontroler się zresetował i nie zdązył odpowiedzieć .

Czyli rozumiem ,ze mam zrobić tak :

Stworzyc w klasie kilka dodatkowych prywatnych zmiennych które będą symbolizować : kres tablicy , postęp w transferze , ew. numer transferowanego pakietu . Następnie uruchomić zdarzenie które prześle header, wyzeruje / ustali powyższe zmienne i zacznie nasłuchiwać , zgadza się ?

0
  1. Uruchomiasz metodę, która używa SerialPort.Write, do wysłania pakietu na port.
    ... program czeka na zdarzenie SerialPort.DataReceived
  2. Następuje to zdarzenie, więc wywoływana jest odpowiednia metoda, która:
    a) sprawdza, czy została zwrócona informacja o tym, że pakiet dotarł cały (jak nie, to sam wiesz, co zrobić)
    b) zwiększa licznik wysłanych pakietów
    c) znowu używa SerialPort.Write do wysłania następnego pakietu
    ... program czeka na zdarzenie, itd.
0

Ok więc przerobiłem program do powiedzmy wersji "dziłającej".

Porcje ładnie są potwierdzane , błędów też w transmisji nie ma ale za to masakryczne sam proces jest wolniej wykonywany. Nie wiem od czego , tak buforowana transmisja pozwala mi na prędkości 500 kbps , przesyłany cały "plik" ma od 9-15 kb ( dla najmniejszej opcji juz jest zbyt wolno ) . Samo potwierdzenie występuje w ok . 100 razach więc też nie tak straszliwie dużo , i czy to ewentualnie mogłoby tak strasznie spowolnić cały proces ?

0

Hehe dzięki , zdaje się , że trafiliśmy na identyczny czas pisania posta .

Dokładnie tak wykonałem , jak napisałeś :)

0

Przy realizacji projektu musze zrobic obrót "zdjecia-(podluznego elementu) w zalezności od wartości sygnalu z czujnika polozenia..wszytko jaksne:) ale PROBLEM MAM TAKI ... sygnaly poprzez port szeregowy (z uc) mają byc przesylane do PC.. NIE WIEM JAK ....Czy ktos robil komunikacje portu szeregowego. ??????
Chodzi o sam odbior. mam podaną ramkę komunikacyjną (nie podam bo jest niekompletna)
i jak ja obslugiwac...czy za pomoca kontrolki samo read() / readline() czy pokolei bity odczytywac , czy jakies odstepy czasu robic.....NIGDY NIE ROBILEM I NIE WIEM JAK SIE ZABRAC..
Proszę o jakies przyklady...najlepiej z przykładową ramką danych.........
W googlowniku popływałem ale duzo tych informacji i sa na tym etapie zbyt rozbiezne dla mnie..

0

j.w

0

Jeśli chodzi o odbiór danych, to nie ma żadnej filozofii. Nasłuchujesz port szeregowy i jeśli coś jest, to wczytujesz to. Następnie sprawdzasz dane, co otrzymałeś. U mnie ramka wyglądała tak, że miałem kod początku - 0x2, następnie dane w kodzie ASCII oraz kod końca bloku - 0x3. Początek i koniec też były kodami ASCII. Zrobiłem sobie to w oddzielnym wątku. Jeśli blok był kompletny, to przesyłałem to do głównego wątku i dalej nasłuchiwałem.

0

Od siebie dodam tylko to że poniekąd obsługa portu szeregowego jest nienajlepiej zrobiona w Windowsach. Otóż przy dużych prędkościach cuda dzieją się w buforze przechowującym dane z portu (niektóre bajty w buforze są dziwnie poprzestawiane miejscami) przy czym chodzi o prace programu real-time - ciągłe pobieranie/wysyłanie danych w dużych prędkościach. Przesyłanie ponoć lepiej wykonać wtedy na porcie ethernetowym (UDP) - oczywiście jeżeli tylko jest to możliwe, działa bardziej niezawodnie.

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