program do odbioru danych przez RS232 [BASCOM]

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Awatar użytkownika
gwozdex
Użytkownik
Posty: 879
Rejestracja: 24 lut 2006, 10:04
Lokalizacja: Czechowice-Dziedzice
Kontakt:

program do odbioru danych przez RS232 [BASCOM]

Post autor: gwozdex » 12 mar 2007, 23:54

Witam serdecznie! Sprawa ma sie tak: jest dany plik tekstowy w którym są tylko i wyłącznie liczby z przedziału 0-255 pisane jedna pod drugą. Liczby te maja przez port RS232 powędrować do pamięci EEPROM na płytce mojego zestawu. Programik- a raczej jego pętla DO- LOOP- na uC wyglada tak:

Kod: Zaznacz cały

Do
        Input "liczba" , Dana
        Call Zap_eeprom(adres , Dana)
        Print "zapisano w EEPROM:" ; Dana;
        Print " pod adresem" ; Adres
        Incr Adres
Loop          
Przy wpisywaniu dowolnych liczb z w/w przedziału w terminalu bascom wszystko działa tak jak powinno: wpisuje liczbę ( Dana jest typu Byte) a ona jest zapisywana w EEPROM. Problem pojawia się w momencie gdy próbuje wysłać nie pojedynczą liczbę a cały plik (zawierający choćby 5 liczb). Do transmisji pliku używam terminala: "Bray's Terminal" wiec nie sadze żeby tam był jakiś błąd lub niedociągnięcie. Przypuszczam ze "miesza" mi tutaj znak ASCII 10. czyli LineFeed, ale nie jestem tego pewien. Do pamieci EEPROM zapisywana jest tylko pierwsza liczba z pliku. Prosiłbym o pomoc w mojej sprawie. Za okazany czas z góry dziękuję i pozdrawiam.

ZbeeGin

Post autor: ZbeeGin » 13 mar 2007, 7:04

Jeśli posiadasz jakiś zaawansowany edytor tekstowy (np. Notepad++), to sprawdź czy na końcach linii jest komplet: CR+LF (kod 13 i kod 10) włączając opcję pokazywania wszystkich znaków.

Przepraszam, ale jak kod będzie wykrywał koniec danych? Wcale go nie wykrywa?

Awatar użytkownika
gwozdex
Użytkownik
Posty: 879
Rejestracja: 24 lut 2006, 10:04
Lokalizacja: Czechowice-Dziedzice
Kontakt:

...A wszystkiemu winny <LF>!!!!

Post autor: gwozdex » 13 mar 2007, 12:29

Rzeczywiście program nie wykrywa końca transmisji- jeszcze nie myślałem jak to rozwiązać. Ale jeśli Kolega ma jakiś sprawdzony sposób to chętnie wysłucham :). No ale póki co wracam do sedna. Tak jak Kolega polecił sprawdziłem czy na końcach linii jest komplet sygnałów CR+LF. Po zaznaczeniu opcji "Pokaż wszystkie znaki" na końcu każdej linijki pojawili sie piękne prostokąciki z napisami CR i LF....... Niestety! Moje przypuszczenia sie potwierdziły. Wszystkiemu winny jest znak LF!!!! Otóż we wspomnianym Bray's Terminal jest funkcja do wysyłania makr przy czym dostępne są wszystkie znaki z klawiatury a symbole opatrzone znakiem "#xxx" generują symbol o numerze xxx (dec). Jeśli np. napiszemy 44#01355#013 to wyślemy w rzeczywistości: liczbę 44 (na maginesie przypominam ze Dana z listingu powyżej jest zadeklarowana jako byte) znak CR, liczbe 55 i znow CR. I tak wysyłane liczby bardzo ładnie wędrują do miejsca ich przeznaczenia czyli do EEPROM.
Jeśli jednak do #013 dodamy #010 (<LF>) wszystko się sypie i zapisywana jest tylko 1. liczba z pliku- każda następna (odebrana) jest zerem.
Ma ktoś pomysł jak rozwiązać ten problem- bo ja przyznam szczerze ze w głowie mam :?: . Docelowo to wszystko ma wyglądać tak: program na PC (Delphi) coś sobie oblicza a wynik jest zapisywany do pliku który potem ma wysłać ( ten sam program) przez RS232 do mojej płytki. No ale co z Tymi znakami LF??????


.....I oczywiście podziękowania za pomoc i .....NOTEPAD++ dla Kolegi ZbeeGin

tasza
Użytkownik
Posty: 1389
Rejestracja: 21 lut 2005, 15:02

Post autor: tasza » 13 mar 2007, 12:47

gwozdex pisze:Ma ktoś pomysł jak rozwiązać ten problem- bo ja przyznam szczerze ze w głowie mam :?: . Docelowo to wszystko ma wyglądać tak: program na PC (Delphi) coś sobie oblicza a wynik jest zapisywany do pliku który potem ma wysłać ( ten sam program) przez RS232 do mojej płytki. No ale co z Tymi znakami LF??????
Hmm, no ale skoro to Twój program ma docelowo wysyłać dane do procesora,
to Ty decydujesz o formacie danych, w szczególności czy na końcu
jest CR, LF czy CR+LF...No chyba że do RS232 używasz jakiegoś 'dziwnego' komponentu.
Więc napisz sobie po prostu króciutki programik, niech on na przykład wczyta
kolejne linijki z pliku do TStringArray, przed włożeniem string-a do arrajki
dobrze jest go oczyścić z białych znaków, tak na wszelki wypadek

Kod: Zaznacz cały

sLine := Trim(sLine);
a potem idziesz po kolejnych elementach tabelki i wysyłasz stringi łączem...
przed wysłaniem, do każdego string-a trzeba dodać takie 'zakończenie' (CR?,LF?,CR+LF?),
aby napis wczytała bascomowa funkcja Input.

Awatar użytkownika
gwozdex
Użytkownik
Posty: 879
Rejestracja: 24 lut 2006, 10:04
Lokalizacja: Czechowice-Dziedzice
Kontakt:

Post autor: gwozdex » 13 mar 2007, 15:51

Tak, to ma być mój program!!! Tyle tylko ze jeszcze nie mam pojęcia jak go napisac, poniewaz praktycznie wogóle nie programowałem "komputerowo"- tzn. pisałem troche w Delphi ale to nie mialo nic wspólnego z wysylaniem danych przez RS232, byly to raczej programy do obliczania wyznacznika macierzy itp... Ale skoro mówisz ze mozna wyslać dana z dowolna kombinacja znaków <CR> i <LF> na koncu linii to pewnie tak jest a to oznacza, że jestem uratowany. Pozdrawiam i serdecznie dziekuje za pomoc.

A jeszcze przy okazji mam takie pytanie: "Czy do realizacji transmisji - od strony PC - bezwzglednie trzeba miec jakis komponent (bede pisał w Delphi)"?
Ostatnio zmieniony 01 sty 1970, 1:00 przez gwozdex, łącznie zmieniany 1 raz.

tasza
Użytkownik
Posty: 1389
Rejestracja: 21 lut 2005, 15:02

Post autor: tasza » 13 mar 2007, 16:06

gwozdex pisze:Tak, to ma być mój program!!!
Wiele :)
gwozdex pisze:"Czy do realizacji transmisji -od strony PC- bezwzglednie trzeba miec jakis komponent (bede pisał w Delphi)"?
Nie bezwzględnie...można to sobie oprogramować 'na piechotę',
w Win32 API są odpowiednie ku temu funkcje:
:arrow: http://msdn2.microsoft.com/en-us/library/aa363194.aspx (warto poczytać!)
ale to jest delikatnie mówiąc....niemiłe.

Do Delphi jest masa komponentów komunikacyjnych, także za free,
ja osobiście używam Async32 - choć staroć straszliwa lecz działa i nie marudzi.
I jest w załączniku.

pozdrawiam,
N.
Załączniki
async32.zip
VARIAN ASYNC32 COMPONENT 1.01
(144.33 KiB) Pobrany 359 razy

Awatar użytkownika
gwozdex
Użytkownik
Posty: 879
Rejestracja: 24 lut 2006, 10:04
Lokalizacja: Czechowice-Dziedzice
Kontakt:

Post autor: gwozdex » 14 mar 2007, 20:53

Witam! Zaraz na początku moja gorąca prośba:" Nie myślcie proszę, że jestem leniwy". Tłumacze sie w kontekście postów Koleżanki Nataszy ("Weźmy się zrób..."). Po prostu nie wiem jak sie do tego zabrać, a zależy mi żeby temat nie przedawnił sie...
W załaczniku umieszczam programik który napisał mi kolega( mam zgode na umieszczenie listingu na forum). Niestety po przedstawieniu problemu- chodzi o wysylanie tych dodatkowych symboli <CR> i <LF>- stwierdził, że zagadnienie wykracza poza jego "umiejętności programistyczne". W związku z tym moja prośba-pytanie- do Was czy moglibyście rzucili okiem na listing i powiedzieć czy da sie z tego coś wyłupać i wysyłać dane bez <LF> na końcu. Pozdrawiam i z góry dziękuje.

[ Dodano: 2007-03-14, 20:56 ]
....i jeszcze komponent uzyty w programie sender. Pozdrawiam.
Załączniki
cport310.zip
(201.75 KiB) Pobrany 396 razy
sender.zip
(243.09 KiB) Pobrany 385 razy

ZbeeGin

Post autor: ZbeeGin » 14 mar 2007, 21:31

Zauważyłem, że jest chyba możliwe przełączenie portu w tryb BINARY (stała dps_BINARY). Być może jest możliwość wysyłania bajtów a nie gotowych ciągów znaków, i wtedy zamiast WriteStr użyjesz innej procedury wysyłającej bajt tak jak jest - jendnak nie potrafię jej w tej chwili znaleźć w gąszczu źródła cport310.
Wymagać to będzie nieco zachodu, ale sam będziesz mógł wysyłać takie znaki (ich kody ASCII) jakie, i kiedy Tobie się podoba.

Awatar użytkownika
gwozdex
Użytkownik
Posty: 879
Rejestracja: 24 lut 2006, 10:04
Lokalizacja: Czechowice-Dziedzice
Kontakt:

Post autor: gwozdex » 14 mar 2007, 21:36

I o to mi chodziło... Znaczy, że sie da:). Dziękuje i pozdrawiam

[ Dodano: 2007-03-14, 23:29 ]
Znalazłem w tym komponencie własność (property) o nazwie TCustomComTerminal.SendLF o wartości boolean. Narazie to tylko teoretyczne dywagacje, ale myślę ze to jest rozwiązanie mojego problemu.

...teraz jeszcze tylko pozostaje nauczyć się programować w Delphi :grin:

[ Dodano: 2007-12-06, 18:28 ]
Co prawda trochę czasu minęło odkąd założyłem ten temat, ale może komuś się przyda to co napiszę. Otóż okazało się, że chcąc wysłać przez RS232 zmienna (typu string) przy spełnieniu jednoczesnego wymogu iż ma on się kończyć znakiem <CR> (kod ASCII 013), żeby można go było odebrać poleceniem INPUT należy wysłać coś takiego:

Kod: Zaznacz cały

S:= 'tekst do sysłania' + #013
. I to jest rozwiązanie moich problemów... Dziękuję za pomoc i pozdrawiam.

ODPOWIEDZ