Po prostu nie możesz korzystać z instrukcji Input tylko z instrukcji np. Inkey i odbierać 128 bajtów o dowolnej zawartości (nawet bajtów zerowych) Po odebraniu 128 bajtów sprawdzić sumę kontrolną, tak jak pisał kolega mirekk36. Jeśli odebrałeś wysłasz ack spowrotem np. z sumą crc ramki Instrukcja Input się nie nadaje do tego celu. Tylko odbieranie za...
To jest proste jak świński ogon :D ahahahaha, ale napisz kawałek kodu. Czy masz tam jakiś LCD czy nie, czy masz tam jakiś Timer ustawiony do odmierzania sekundy czy Wait`ujesz :D Czy w dokumentacji czujnika pisze, że nadaje tez na końcu niewidoczne w terminalu znaki 13 lub 10? EDIT: aaa masz tu taki prosty. Napisałem przy śniadaniu więc błąd mógł się...
Rozumiem, czyli zmienna String to jakby ciąg zmiennych bajtowych stanowiący całość i w programie instrukcja: IF zmienna_string_1znak(to jakby jedna zmienna bajtowa, tylko inaczej interpretowana, bo nie mogę do stringa w programie wpisać prosto wart. liczbowej, a jedynie literę, która reprezentuje ową wartość liczbową) = "a" then... jest równoważna...
Użyć przerwania. A dokładnie config serialin z funkcją Bytematch. Ewentualnie po każdym odebranym znaku zerowym Chr(0) dać Clear Serialin Wtedy bufor będzie zawsze ustawiony na początek.
Trochę trudno zrozumieć ten kod bo pewnie robi coś innego niż zamierzasz. Kiedy włączysz odbieranie znaków do bufora to odbierane są "w tle" w "ukrytej" obsłudze przerwania. Teraz o tym że w buforze czekają znaki możesz się dowiedzieć albo testując funkcją Ischarwaiting() albo ustawiając trigger na jakiś konkretny znak własnie poprzez Bytematch Kiedy...
Witam chcę zrobic wybór opcji w menu przez przewijanie paska z literami w formie inwersji tzn: jeśli literki są czarne to wybrana opcja ma być białe litery na czarnym tle. Czy istnieje jakaś funkcja pozwalająca zrobić w bascom inwesję pojedyńczego znaku? Pozdr. lolek
Tu masz przykład odbierania tekstu po RS-232 w Bascomie: [syntax=basic4gl]$regfile = "attiny2313.dat" $crystal = 8000000 $baud = 19200 Const Maxlen = 40 'Deklaracje stalych Dim Akey As Byte 'Deklaracje zmiennych Dim I As Byte Dim Pwm As Integer Dim Cmd As String * 4 Dim Buffer As String * Maxlen Dim E As Eram String * Maxlen I = 0 Config Pinb.2 = Output...
Witam. Włącz przerwania, inaczej dane nie wpadną do bufora.
To powinno odczytać cały bufor: Odczytaj_sprzetowy_uart: Uart_txt = "" Do 'Odbierz znak po znaku Kod = Inkey() Uart_txt = Uart_txt + Chr(kod) 'Zapisz w Uart_txt Bufor = Ischarwaiting() 'Sprawdź czy jest znak Loop Until Bufor = 0 'Zakoncz jeśli brak znaku Return Do wyłuskania danych polecam instrukcję Instr
Rozwiązanie jest proste :) Odbieraj 156 znaków. Po odebraniu znaku zwiększaj zmienną pomocniczą. Jeśli osągnie ona 156 to zakończ odbieranie. Użyj np. petli FOR..NEXT lub DO..LOOP UNTIL
A może odbieraj większy string i sprawdzaj pierwszy znak.
Witam, Jak można odebrać i wyświetlić na LCD taki ciąg znaków wysyłanych z PC przez RS232 "Wzmienna spacjazmienna" (PC->Atmega) "W128 021" gdzie W jest warunkiem odebrania znaków przez Atmegę i ciąg zwrotny (Atemga->PC) "C125 035"
Jeśli jest możliwość wykorzystania pinów uC dodałbym kontrole przepływu przez port sterując sygnały RTS/CTS portu COM co znacznie poprawi wysyłanie i odbieranie z portu bez potrzeby stosowania znaku na koncu wysyłanej ramki ;)
Znaki terminujące - czyli "\r\n", ewentualnie NULL, zazwyczaj kończą zmienne typu string. Nie sądzę, żeby były wysyłane po każdym znaku. Nie programowałem w C#, ale wydaje mi się, że kompilator dodaje Ci te znaki automatycznie. Spróbuj odbierane znaki zapisać do zmiennej innego typu, np "byte" lub "char". Jak wygląda Twoja procedura odbierająca znaki...
Zawsze odbierasz przez UART dane binarne. Możesz je tylko sobie wyświetlić lub wypisać jako znaki, liczby dziesiętne lub szesnastkowe. Odbierasz bajty, masz z nich złożyć daną 16-bitową, np. tak: wartosc = bajt_mniej_znaczący + bajt_bardziej znaczący * 256
dim urx_bufor(5) as byte dim urx_licznik as byte dim urx_odebrano as bit ... urx_licznik=1 'to jest potrzebne dla bascom'a bo tablice zaczynaja sie od 1 a nie 0 enable interrupts ... przerwanie_urx: if urx_licznik<5 then urx_bufor(urx_licznik)=udr incr urx_licznik end if if udr=13 then set urx_odebrano 'odebano ENTER if udr='T'...
z ciągu (powiedzmy 5-cio znakowego) udało mi sie zczytać tylko 2 znaki. nie wiem dlaczego. A może poprostu program się nie wyrabia z odbieraniem znaków? Czy bascom buforuje odebrane znaki?
Witam Inkey odbiera tylko jeden znak (bajt) przesłanej informacji. Użyj lepiej funkcji – input /zapoznaj się z pomocą Bascoma. Do przesyłania informacji na duże odległości używaj jak najmniejszej szybkości.
pewnie piszesz w bascom ,wiec masz kod odbierania danych (całych stringów ) w przerwaniu :) : Config Serialin = Buffered , Size = 20 do If Ischarwaiting() = 1 Then '1 - odebrano znak,0 - pusty bufor Call Read_rs232 End If loop Sub Read_rs232 Dim Bufor As String * 24 Input Bufor Noecho end sub
Może gubisz przesyłane znaki bo gdzieś pętla jest za wolna. Jeśli taką komunikację wrzucisz do większego programu to problem się tylko pogłębi. Lepiej skonfiguruj bufor i Bascom będzie odbierał wszystkie znaki w przerwaniu. Nie przegapi żadnego znaku. ->Config Serialin0 Widać, że dodajesz Enter na końcu stringów. Możesz to monitorować i parsować dane...
W telegraficznym skrócie - w "nadajniku" wysyłasz znaki komendą PRINT, np "A" dla pierwszego LEDa i "B" dla drugiego. W odbiorniku odbierasz dane z UARTu (inkey) i jeśli jest "A" to zapalasz jedną diodę, jak doszło "B" drugą.
Input nie zawiśnie jeśli ustawisz poprawnie "Config Input = Cr", bo standardowo Input "czeka" na CRLF. A odczytać musi, bo przejście do podprogramu nastąpi tylko w przypadku nadejścia znaku entera (13). Więc z góry wiadomo, że Input je odbierze. Bufor jest czyszczony przez ten Input właśnie. Sorry pomyłka - standardowo Input czeka tylko na CR więc jeśli...
Czy nie lepiej by było zamiast bawić się w pojedyncze znaki odebrać cały tekst hurtem. [syntax=vbnet] Do If Tekst = "Zgaś" Then portc.1 = 0 Elseif Tekst = "Zapal" Then portc.1 = 1 End If Loop End odbierz: Input Tekst Return [/syntax]
Komenda Input czeka na znak entera. Jeśli chcesz odbierać pojedyńcze znaki zastosuj Inkey lub Waitkey. Po resztę informacji odsyłam do Helpa Bascoma
najpierw zewrzyj sobie nóżki 11 i 12 i zobacz czy to co wpisujesz w terminalu wraca do niego - powinno być echo - czyli piszesz literkę np A i powinna ona polecieć do MAX232 i wrócić do terminala i się wyświetlić - jak to będzie dobrze to możesz być pewien, że ten tor masz OK , a jeśli nie będzie tak? to sprawdź kabel i połączenia - nie ma bata, musi...
Probowalem. A jak odbierać znak w takim razie?
No dobra. Wywal wszystko na linii Tx telefonu do Rx procesora. Ma być połączenie bezpośrednie. Na drugim kierunku zostaw tak jak masz. Poniżej kod do testów. Powinien działać. [syntax=basic4gl]$regfile = "m32def.dat" $crystal = 16000000 $baud = 19200 Config Lcd = 16 * 2 Config Serialin = Buffered , Size = 100 Enable Interrupts 'Declare Sub Oproznij_bufor...
Mam jeszcze jedno małe pytanie. W BASCOM chcę odbierać ciąg znaków z portu RS232 i przypisać je do jakiś zmiennych. Jak mam to zrobić ppoprawnie bo robie tak i nie za bardzo mi to działa Wysyłam ciąg znaków w Delphi 7 jako PChar: #145#123#150#78 A w BASCOM odczytuje tak: A,B,C,D = są jako Byte do A = Input() if A=145 then B=WaitKey() C=Waitkey() D=Waitkey()...
Zrobilem cos podobnego, tyle ze zapis na karcie SD. Generalnie problem jest dosc prosty, tylko musisz zrobic bufor (np cykliczny) do odbioru znakow z uarta, bo bedziesz gubic dane. Mozesz zrobic tak, ze odbierasz np 30 znakow i dopiero cala paczke zapisujesz w eepromie, w tym czasie inne znaki sa zapisywane w buforze. Dlugosc bufora musisz tak dobrac...
Teraz zgupiałem ... jak ją odczytać? Nie wystarczy wywołać jeszcze raz Gosub Odczytaj_uart W części programu -> Odczytaj_sprzetowy_uart Funkcje Do kończe jeśli Loop Until Bufor = 0 Or Kod = "13" czyli jeśli wystąpi znak CR lub brak znaku, to może być powodem?
A ja się zastanawiam po co Ci to: [syntax=basic4gl]Config Serialout = Buffered , Size = 20[/syntax] Bo jeżeli ręcznie odbierasz znaki w przerwaniu (a odbierasz) to to jest zbędne. Albo może i nawet szkodliwe.
Napisałeś: "Gorzej z współpracą z ciągiem otrzymywanym z terminala" U mnie nawet nie odbiera pojedyńczego znaku, a co dopiero ciąg znaków.
Tak, kod jest potrzebny. Założenie jest takie że kod będzie modyfikowany. Urządzenie jest eksperymentalne więc trudno przewidzieć jakie ciagi znaków beda odbierane i wysyłane.
przerwanie od portu szeregowego obsługujesz w ten sam sposób jaki i każde inne przerwanie. Ale to nie wszystko ;) Jeśli skonfigurujesz seriala do pracy z buforem , to Bascom sam "podłoży" przerwanie i będzie za Ciebie odbierał znaki z uarta i zapisywał do bufora kołowego.Instrukcję obsługi Bascoma trzeba czytać , czytać , czytać... , a nie tylko pytać...
Pomijając tragiczny kod zastanawiam się po co wysyłasz milion znaków, przecież w jednej ramce rs możesz wsadzić 255 różnych znaków, na tak prostą rzecz nie potrzebujesz takich ramek.
[syntax=basic4gl]Dim Znak as byte '... Do '... Znak = Inkey() If Znak > 0 Then '... End If '... Loop[/syntax]
Witam, mam dosyć upierdliwy problem z transmisją UART z użyciem modułów radiowych HM-R/T868. Problem polega na tym, że jeśli nadajnik nic nie nadaje, to odbiornik odbiera dziwne "śmieci" z eteru. Problem znika w momencie, kiedy będący w zasięgu nadajnik nadaje cokolwiek. Więc w głównej pętli programu umieściłem komendę: [syntax=basic4gl]Print chr(0);[/syntax]...
Witam, chyba wyjaśniło się, mówimy o innych przykładach:) Ja myślałem o układach RFM01/RFM02. Nie wiem jak jest w RFM12. A że poprawnie odbiera znaki dowiedziałem się po wysłaniu tego do portu RS232 a następnie do komputera.
Najpierw sprawdź przejściówkę. Zewrzyj 2 i 3 pin. Kiedy będziesz wklepywał coś na klawiaturze kiedy otwarty będzie Terminal to w jego oknie pojawiać sie powinny kolejne znaki. W terminalu widać tylko to co do nas wraca. Normalnie za Echo pracuje mikrokontroler /lub nie jeśli sobie nie życzymy. Kiedy zewrzesz 2 z 3 to to co wyślesz powinno do Ciebie...
Nie wiem czy będziesz mógł ustawić Timeout bo jest od wersji 2076. Najwyżej zakomentuj. Reszta powinna działać. Poczytaj o "Config Serialin" i "Ischarwaiting" Tak dokładniej to Input czeka na Enter albo na to co ustawimy żeby czekał (Config Input) Jak Enter nie nadchodzi z powodu jakiegoś błędu to przydaje się Timeout. Najczesciej odbieram dane po jednym...
W Bascom'ie masz instrukcję VAL. Najpierw deklarujesz zmienne B [byte/word] i S [string*x; x=liczba znaków] a następnie konwertujesz B=val(S) i dalej używasz zmiennej B. W odbieranym stringu muszą być tylko znaki z zakresu 0..9 bez literek ;-) inaczej "krzaki".
$crystal = 16000000 $baud = 9600 Przy tej prędkości transmisji i tym kwarcu będziesz miał spory błąd. Jeżeli chcesz używać tej prędkości to zmień kwarc na 8MHz. Osobiście gdy potrzebuje transmisji RS232 to używam programu który odbiera i wysyła znaki w przerwaniu od UARTA.
Składaj ciągi z odbieranych znaków. Jeśli trafi się przecinek to koniec danej partii. Potem tylko analiza: HELLO? END? Nie, więc liczba. Oczywiście przecinek trzeba pominąć.
W takim razie jak inaczej wykryć koniec ramki skoro na końcu zawsze jest co innego? A procedurę zapisu na kartę jak mam szybciej wykonać? Nadajnik wysyła ramki co sekundę i nie mam na to wpływu. A jak wykryć koniec ramki po znaku CR? Zrobiłem jak piszesz i dałem oczekiwanie na znak "$". Jest trochę lepiej ale i tak są błędne ramki.
Problem rozwiązany zmieniłem funkcje odbierania znaku na taką [syntax=c]//Odbieranie unsigned char uart_odbieranie( void ) { /* Czekaj na dane do odbioru */ if( ( !(UCSRA & (1<<RXC)) )==0)return UDR; /* Pobierz i zwróc dane pobranie z buforu */ }[/syntax]
Sproboj zrobic tak, żeby procesor po odebraniu danych czekał na określony znak (przyslany z komputera przez RS), po jego odebraniu niech natychmiast odsyla dane, w prog. na PC trzeba oczywiscie odbierać dane zaraz po wyslanie tego znaku inicjującego odbiór... Upewnij się też, czy nie masz zapełnonenego bufora nadawczego w uC.
(at)grala1Ten Twój kod jest trochę za prosty i z czasem zgubi synchro niemniej jak wrzucisz ten poprawiony na symulator, albo nawet uruchomisz na żywca z tym co Tobie tam nadaje to na chwile powinien podziałać ;) Lepiej byś odbierał znaki w przerwaniu do bufora. Procesor na nic by nie czekał i miał czas na inne sprawy. Do tego synchro, jakis timeout...
Witam Czy jak w języku Bascom AVR wywołam instrukcję PRINT "a", to ów znak "a" zostanie wysłany przez UART procesora jako liczbowy kod a następnie w następnym procesorze, który odbiera dane przez UART, znów zamieni się na znak ASCII, czy trzeba w programie stosować instrukcję Chr(odebrane dane), aby zamienić liczbowy kod na odpowiadający mu znak zestawu...
Procedura podana przez Konrada działa bardzo ładnie ale ma jedną wadę odbiera dana jako znak ASCII a ja chce odczytać zwykłą daną byte w ten sam sposób.
No i problem wygląda na rozwiazany, to co powodowało niedziałanie ww układu to fakt, ze w przerwaniu od UART nie pobierałem znaku z buforu, przez co flaga nie zostawała wyzerowana i kolejne znaki nie były odbierane... Innymi słowy powinno być tak: Port: A=InKey() Toggle portd.6 Return
Witam, Przejzalem juz kawal forum ale nie znalazlem odpowiedzi na moj problem. Jak w symulatorze BASCOM'a odebrac dane z fizycznego portu RS kompa?? Wysyłanie dziala ale odbieranie za nic nie chce. Polaczylem dwa kompy po RSach (transmisja ok - przez hiperterminale dziala). Na jednym mam bascoma a na drugim hiperterminal. Programik najprostrzy wysylajacy...
odbieranie znaku delphi bascom odbiór znaku odbieranie ramki bascom
reset philips magic termostat powietrza ładować latarka chiński
milwaukee klucz interfejs delphi
Regulacja gaźnika w pilarce NAC CST45-40-01AC-V Niestabilne połączenie Wi-Fi w domofonie - jak rozwiązać problem?