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...
dodatkowy problem w tym że sterownik do którego pisze program musi posiadać możliwość konfiguracji portu rs i chyba bascom nie był najlepszym wyborem do tego typu aplikacji
Jak w BASCOM-AVR zbudować pełny string z INKEY/INKEY$, obsłużyć echo, BACKSPACE, buforowanie i przerwania UART? Interesuje mnie praktyczny algorytm i zabezpieczenia.
Dzięki za podpowiedzi, wykorzystałem polecenie inkey() i to wystarczyło w zupełności. Kodu nie podaję, gdyż wystarczy wpisać w helpie inkey i wszystko jasne jak na dłoni :)
Komunikacja działa prawidłowo jednak odebrane dane chcę mieć w formie BYTE lub WORD Kod Bascom dim a as byte a = inkey print a Gdy z terminala wysyłam 2 to procek zwraca mi 50 gdy 1 to 49 gdy 3 to 51 itd Pewnie gdyby a była single to by było O.K. Co zrobić by wysłane 2 z terminala = 2 w procku /zmienna BYTE/??
Możesz użyć Inkey. Tylko funkcja ta ma taką cechę że nawet jak nic nie ma w UDR to zwraca 0. Także najlepiej zrób to w ten sposób że najpierw sprawdzasz czy jest znak (Ischarwaiting) a potem jeśli jest, to odbierasz Inkeyem. Można też zrobić to w przerwaniu. Jeśli początek odbieranego tekstu masz stały to można też zrobić pętlę w któej ciągle pytasz...
Długo by tłumaczyć. Przede wszystkim przerwanie przychodzi po pierwszym znaku, a Inkey odbiera cały ciąg znaków Z tego powodu Inkey nie nadaje się do użycia w przerwaniu. Ty użyłeś go w przerwaniu i tym samym blokujesz przerwania. Bo przerwanie przychodzi po pierwszym odebranym znaku, ale zostaje tam aż nie przyjdą kolejne znaki. Poza tym użyłeś Inkey...
Już chyba wiem. Nie możesz porównywać zmiennej tekstowej B do Chr (0), bo zmienna tekstowa kończy się takim znakiem. Czytaj przez Inkey do zmiennej typu Byte a następnie buduj string tak: A= A + Chr (B) Czyli zmień zmienną B na typ Byte
U mnie poszło coś takiego: $regfile "m16def.dat" Config Lcd = 16 * 2 $crystal = 1000000 $baud = 9600 Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , E = Portb.1 , Rs = Portb.0 Config Serialin = Buffered , Size = 12 Dim X As Integer , Y As Integer Config Pind.1 = Output Enable Interrupts ' Musisz włączyć...
Zrób sobie 6 element tablicy który będzie np znakiem ENTER (żeby rozpoznawać koniec tablicy) natomiast w Bascomie możesz wtedy użyć nawet polecenia INPUT, które po otrzymaniu znaku ENTER wpisze ci twoich 5 elementów tablicy do stringa (też jakby tablicy) - a ze stringa możesz to przełożyć do normalnej tablicy bascomowej - zrobić z tym co ci się żywnie...
Mień Inkey na Waitkey, zmień definicje zmiennych i wklej kod po modyfikacjach. Program nie może "wrócić na chwilę" do procedury... Upewnij się jeszcze na sto procent, czy wysyłasz jeden znak po UART.
Po wczorajszym, (zamknięcie tematu, i itp) Postanowiłem że postaram się coś samodzielnie wyklecić w bascomie (w końcu to mój projekt) narazie to tylko przykładowy kod, w którym chodzi tylko o wyjaśnienie zagadnienia, i ewentualne poprawki. MASTER : $regfile = "attiny2313.dat" $crystal = 4000000 Config Serialin = Buffered , Size = 15 Const...
Wiem, że InKey zwraca 0 gdy nic nie dostał. Inaczej nie pytałbym o IsCharWaiting... Jak zatem rozwiązać ten problem? Od razu mówię, że pisanie w C lub asemblerze to dla mnie za wysokie progi. Sprzętowy UART w atmelach (jeszcze w miarę rozsądnych cenowo) dochodzi do dwóch linii uart... czyli wciąż za mało.
mylisz się. Samo inkey zwraca jeden znak ale tam jest wazna cała pętla a nie pojedyńcza komenda. Masz dołączyć całe to od s="" do loop. s="" ' wyzerowanie bufora do 'rozpoczęcie pętli która będzie aż do loop lob exit do a=inkey 'oczekuje na znak przychodzący if a=0 then exit do 'jezeli przyjdzie tzw znak zero to opuszczana jest petla s=s+chr(a) ' dodaje...
433 lub 868 różnią się długością antenki :) 433 teoretycznie jest też bardziej zajęta. W TME mają stan magazynowy 0, więc nie wiadomo kiedy je dostaniesz, w Seguro mają od reki - wersja SMD jest IMHO lepsza, bo mniejsza, a lutuje się ją banalnie - rozstaw metalizowanych wcięć do lutowania to 2,54mm, czyli standardowo tak jak DIL. Soft producenta oczywiście...
miałem podobny problem. Przerwanie od UART powodowało że program wpadał w przerwanie i nie chciał wyjść. Zrezygnowałem z przerwania i w pętli głównej wstawiłem Zmienna = inkey ; if zmienna = ??? then ???. to rozwiązanie nie powoduje przerwania ale trzeba czekać aż program w pętli dojdzie do tego punktu. Wszystko zależy czy ma natychmiast reagować na...
... Powiedz , dlaczego musisz Waitkey() , a nie np. Inkey ?? Dla tego, że Inkey nie działa tak jak bym chciał. Program rysuje mi na konsoli w trybie znakowym okienka i poruszam się po nich za pomocą strzałek kursora. kod strzałek kursora w terminalu jest następujący: strzałka w górę to znak klawisza "ESC"+"[" + "A" strzałka w dół to znak klawisza "ESC"+"["...
$regfile = "m128def.dat" $crystal = 16000000 $baud1 = 38400 Config Com2 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0 Dim Znak As String * 5 Open "com2:" For Binary As #2 Print #2 , "start" Wait 1 Pg: Input #2 , Znak Waitms 500 Print #2 , "Odebrano znak : " ;...
Witam mam taki problem potrzebuję wysyłać przez port com danie w taki sposób, aby były one traktowane jako znaki ASCII bo tylko takie mogę poprawnie odebrać mikroprocesorem. Z tego co zauważyłem jedynym działającym w przerwaniu od UARTa poleceniem odbioru, w bascom AVR jest inkey a to odbiera tylko znaki ASCII :/ No i tu pojawia się problem bo o ile...
BlueDraco - owszem, łatwiej jeden uC. Ale jako że siedzę w avrach i bascomie, to raczej nie mam zamiaru wyrzucać kolejnych pieniędzy, płytek które wytrawiłem i zlutowałem po to żeby babrać się w inną rodzinę procesorów. Poza tym zanim nauczyłbym się nowego języka i nowych uC minęło by sporo czasu, który raczej muszę przełożyć na inne cele (matura +...
Manual BASCOM-a, w opisie instrukcji SERIALIN mówi że bufor danych wejściowych przechowywany jest w wewnętrznej tablicy bajtów _RS232INBUF0 . Oprócz tego są dwa wskaźniki, na początek tych danych oraz na ich rozmiar. 'Using the CONFIG SERIAL=BUFFERED, SIZE = 10 for example will 'use some SRAM memory 'The following internal variables will be generated...
Przysiada zasilanie telefonu lub twojego uP - albo co gorsza zasilasz je z wspólnie z LM7805 a telefony modemy GSM pobierają ok 1000mA przy 12-10V No i oczywiście stos pamiętaj że funkcja inkey też zajmuje stos i może go przepełniać jeśli jeszcze masz jakiś timer i przerwania a wszystko obsługujesz przez LCD to można go zapchać w bascomie - spróbuj...
ok panowie - poradziłem sobie nieoczekiwanie w nieoczekiwany , sprawny, szybki i łatwy sposób, przynajmniej jeśli chodzi o odczyt z układu mojego SLAVE i to bez żadnego softI2C itp... ... jak ? jesli to kogoś zainteresuje .... Bascom to jednak fajne "zwierzątko" otóż w kilku linijkach po obu stronach zorganizowałem softwarowy RS232 na dowolnie wybranym...
INKEY i INPUT stricte nie czyszczą bufora. Od tego jest CLEAR SERIALIN. Jednak korzystanie z INKEY i INPUT pobierają dane z bufora i przesuwają wskaźniki, co także powoduje, że bufor jest "opróżniany" - choć dane w pamięci dalej są.
A ja dodam jeszcze że kontrolery muszą być traktowane z odpowiednich kwarców w zależności od prędkości transmisji. Zobacz Sobie tabelę błędów Uart w zależności od zastosowanego kwarcu. Nie ma takiej potrzeby, wystarczy, że taktowanie będzie praktycznie identyczne i nastawy USART takie same. Do niczego nie jest w takim wypadku potrzebne precyzyjne ustalanie...
Co będzie jak jednym z kodów przesłanych do mikrokontrolera będzie znak o kodzie 0? Odp: Nie zostanie zauważony. Dlatego INKEY() powinno się poprzedzać operacją sprawdzenia zajętości bufora UDR.
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ą.
Taj jak napisałem wyżej. WAITKEY będzie czekało do czasu, aż coś odbierze. Jeśli w tym czasie wystąpi jakieś przerwanie to się ono wykona i wróci do programu wykonywanego wcześniej, czyli do WAITKEY (chyba, że WAITKEY będzie w jakimś podprogramie przerwania - wtedy kolejne przerwanie się nie wykona (wykona się po skończeniu aktualnego), chyba że na...
To zamiast Inputbin użyj Inkey.
1) Brak deklaracji CONFIG COM w obu programach 2) W odbiorniku wyrzuć TOGGLE i wstaw RESET bo za chwilę napiszesz czemu led się ciągle świeci ale przyciemniony 3) W odbiorniku wykorzystaj ISCHARWAITING i INKEY. Odbierasz tylko A i na podstawie czy jest =10 czy =15 wykonujesz ifa do świecenia ledem
Problemem okazał się kabelek używany jako przedłużacz. Na oko normalny żeńsko/męski szeregowy db9, ma po sprawdzeniu takie połączenia: 2--3 3--1 5--9 Ciekawe do czego służy taki wynalazek... Zlutowałem nowy kabel i śmiga. Można zamknąć problem.
Dim B as byte ..... [program] B =waitkey() .......[program] If B = 121 then ..... W sumie wystarczy samo B = waitkey() lub B = inkey() a to if to już chyba wiesz do czego nie?? SZUKAJ!! wszystko jest w helpie bascomu!!
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.
Sądzę że prościej jest użyć INKEY() niż INPUT Dim pełnyciąg As String * 100 Dim zmienna As Byte do zmienna=inkey() pełnyciąg=pełnyciąg+zmienna incr a if a>100000 then a=0 exit do end if if zmienna>0 then a=0 loop until zmienna= 13
czy nie potrzebna jest tutaj instrukcja INKEY() ? swojego czasu zrobiłem taki układ , że dwa procki atmega8535 przesyłały między sobą zmienną. program zajął dosłownie 3,4 linijki w odbiorczym użyłem instrukcji inkey() tzn , jeżeli było coś w buforze(różne od 0 ) to wyświetlało daną. oczywiście czasy w realizacji pętli były takie same oraz kwarce również...
SERIN i SEROUT to nie jest do RS232. Do tego jest Print/Printbin i Input/Inputbin. Jest jeszcze Inkey.
Ja robiłem podobnie do twojego tyle że zamiast "waitkey" używałem "inkey" w przerwaniu . Odbior: B = Ischarwaiting() If B = 1 Then C = Inkey() If C = "Q" Then Inputbin Aa(1) , Aa(2) , Aa(3) , Aa(4) , Aa(5) , Aa(6) End If End If Return Czyli Q robi u mnie za bajt startu a resztę danych przypisuję zmiennym . W programie głównym obrabiam te zmienne. ps:...
Zresetować SUB?? Chodzi ci o wyjście z suba? On Urxc Getchar Enable Interrupts Enable Urxc dim x as byte dim znak as byte X = 52 petla_glowna: gosub Wykonaj goto petla_glowna end Wykonaj: Incr Koniec if koniec=x then goto petla_glowna end if return :getchar Znak = InKey() X:=Znak return
Może nawet więcej niż dwa, chodziło mi o tą konkretną. Kolego janbernat zmodyfikuj program wg. mojej pierwszej propozycji. Dodano po 4 Już wiem, zmienna Err jest tworzona automatycznie przez kompilator, można ją wykorzystać np. w funkcji Inkey(). Nie wiem czy działa też w przypadku Getatkbd(), ale w przykładowych programach z dokumentacji nie ma takiego...
Zastosuj bufor: Config Serialin = Buffered , Size = 100 enable interrupts A oczekiwanie na znak zrób: Bufor_flaga = Ischarwaiting() : If Bufor_flaga = 1 Then Gosub Odbierz_uart Następnie procedura odbioru danych: Odbierz_uart: Bufor = "" Do Bufor_znak = Inkey() Bufor = Bufor + Chr(bufor_znak) Bufor_flaga = Ischarwaiting()...
Skorzystaj z Inkey() i IsCharWaiting().
U mnie działa. Dodano po 2 Bo powinno być: K6 = Inkey(#1) ;)
powinno byc cos takiego (to tylko fragment kodu) dim znaki(19) as byte dim licznik as byte licznik=0 enable interrupts enable urxc on urxc odbierz 'jak odbierze znak to przerwanie do:loop:end 'glowna petla tu robisz co chcesz odbierz: znaki(licznik)=inkey()'o... znak trafi do tej zmiennej incr licznik if licznik...
Witam, zanim zabierzesz się za pisanie własnej obsługi przerwań do RS232 w Bascomie, to może najpierw spróbuj zrobić to w oparciu o dobrodziejstwa jakie daje ci Bascom. nie znasz poleceń INPUT , INKEY czy PRINT ???? do tego jeszcze może Config Serialin bo w powyższym kodzie odstawiasz niezły "miszmasz" i nie ma co się dziwić, że ci nie działa. Oczywiście...
moze powinieneś skorzystać z instrukcji inkey() , zobacz w helpie jej zastosowanie.
A może bardziej sensowne byłoby: [syntax=basic4gl] If S = 0 And PIND.7 = 0 Then port = portc End If [/syntax] e marcus
1) Warunek jest taki że string zawsze musi mieć taka samą długość 2) Użyj funkcji MID aby powycinać ze stringa kawałki z poszczególnymi temp 3) I tutaj uwaga - konwersje string->liczby są pamięciożerne. Jeśli nie wykonujesz żadnych obliczeń temperatury itp to odebrany string wyświetl na lcd jako string a nie jako bajty. Poprostu funkcją MID porozcinaj...
Zrezygnuj z funkcji Input, znacznie lepsza jest Inkey w pętli. Wtedy masz nad wszystkim kontrolę.
To nie jest dobry sposób na odczyt bufora. [syntax=basic4gl] '------------------------Odczyt UART w przerwaniu------------------------------... Serial0charmatch: Enter = 1 If Ignoracja = 0 Then Input Todczyt Noecho End [/syntax] Zawsze miałem kłopoty ze skompletowaniem linii oraz pojawiało się dużo przekłamań jak używałem Input. Lepszym sposobem jest...
Nie pisałem nic na Rs485 ale mam kilka uwag do programu. Zacznij najpierw od poczytania w helpie bascoma, co robi dokładnie instrukcja Inkey() a dowiesz się że odbiera 1 bajt (jeden znak) z bufora. Sprawdzanie więc warunku B = "zaswiec" nie ma najmniejszego sensu. Nie wiem też po co przełączasz tyle razy układ w nadajnik <>odbiornik: ...... Reset...
To możesz zrobić tak: [syntax=basic4gl] Odczytaj_sprzetowy_uart: Dane = "" Do 'Odbierz znak po znaku Kod = Inkey() Dane = Dane + Chr(kod) 'Zapisz w Dane If Dane = "Obroty1" Then Obroty = 1 If Dane = "Obroty2" Then Obroty = 2 If Dane = "Obroty3" Then Obroty = 3 Bufor = Ischarwaiting() 'Zakoncz jeśli brak znaku Loop Until Bufor = 0 Return [/syntax] i...
inkey bascom inkey inputbin inkey ischarwaiting
ładowania słoneczna asrock p4i45pe zmiana przepustnica
parkowanie silnika wycieraczki dioda ld701
Siemens suszarka – nie działa przedni wentylator, usterka, diagnostyka, iQ500, iQ700 Kabel HDMI do Chromecast 4K - czy jest potrzebny?