budowanie stringóe inkey
INKEY()
/INKEY$
, każdorazowo doklejając odebrany znak do zmiennej typu String
. 0
lub ""
), obsługa klawiszy specjalnych (ENTER, BACKSPACE), zabezpieczenie długości bufora.INKEY()
→ zwraca Byte
(kod ASCII) pierwszego znaku w sprzętowym buforze UART; 0
gdy bufor pusty. INKEY$
→ zwraca String * 1
; pusty string (""
) oznacza brak znaku. Dim RxTxt As String * 64 ' rozmiar dobrać do aplikacji
Dim ch As Byte ' pojedynczy znak – INKEY()
RxTxt = "" ' inicjalizacja
Do
ch = Inkey() ' lub ch$ = Inkey$
If ch <> 0 Then ' znak czeka
Select Case ch
Case 13 ' ENTER (CR)
Exit Do
Case 8 ' BACKSPACE
If Len(RxTxt) > 0 Then
RxTxt = Left(RxTxt, Len(RxTxt)-1)
Print Chr(8); " "; Chr(8); ' korekta echa
End If
Case Else
If Len(RxTxt) < 64 Then
RxTxt = RxTxt + Chr(ch) ' doklej
End If
End Select
End If
Loop
Print "Odebrany tekst: "; RxTxt
RxTxt
zawiera kompletny łańcuch.INKEY()
działa nieblokująco – CPU cyklicznie sonduje rejestr odbiorczy UART. String
w BASCOM‑AVR zajmuje stałą, statycznie rezerwowaną ilość RAM – przekroczenie deklarowanej długości nadpisze pamięć!Inkey()
).IsCharWaiting()
zwracającą liczbę bajtów w buforze programowym, co upraszcza warunek pętli. GetRCV
, RxcIsr
) zamiast aktywnego polling‑u INKEY()
, co poprawia odporność na przepełnienia przy wyższych baudach (115 200+). INKEY()
.Klawisz | Kod ASCII | Typowa obsługa |
---|---|---|
BACKSPACE | 8 | usuwanie ostatniego znaku |
ENTER (CR) | 13 | zakończenie wprowadzania |
LF (10) | 10 | często ignorowany lub łączony z CR |
ESC | 27 | przerwanie/zerowanie |
Analogicznie do C, INKEY()
≈ getchar()
w trybie nieblokującym, przy czym zwraca 0
zamiast EOF
.
Print Chr(ch);
) poprawia ergonomię terminala. Dim t0 As Word : t0 = Timer1 ' Timer1 w ms
If Timer1 - t0 > 5000 Then Exit Do ' 5 s bezczynności
INKEY()
przy wysokim obciążeniu CPU może gubić znaki; wówczas użyj przerwań RX. String
spowalnia kod; do dużych ramek (np. JSON) rozważ tablicę Byte
i własne zarządzanie indeksem. <2.0.7
) INKEY$
nie obsługiwał buforu programowego – aktualizacja rozwiązuje problem.INKEY()
polling vs. ISR + RingBuffer (circular queue
). RS232.INC
– gotowy handler przerwań. WaitKey
(blokująca) i zobacz wpływ na zużycie CPU. String
na usage RAM w AVR vs. XMEGA.Budowanie stringu z INKEY()
/INKEY$
polega na: (1) cyklicznym odczycie znaku, (2) sprawdzeniu jego wartości, (3) doklejeniu do bufora z kontrolą długości oraz (4) obsłudze znaków specjalnych. W nowoczesnych aplikacjach zaleca się jednak przechwytywanie znaków w przerwaniu i buforowanie w pamięci pierścieniowej, co minimalizuje ryzyko utraty danych i pozwala procesorowi na wykonywanie innych zadań.