BASCOM-AVR INKEY budowanie stringów, obsługa UART, echo, buforowanie, przerwania

Pytanie

budowanie stringóe inkey

Odpowiedź Sztucznej Inteligencji


Bezpośrednia odpowiedź na pytanie

  • Aby „zbudować” (skleić) pełny ciąg znaków w BASCOM‑AVR wykorzystuje się wielokrotne wywołania funkcji INKEY()/INKEY$, każdorazowo doklejając odebrany znak do zmiennej typu String.
  • Kluczowe elementy: pętla odczytu, kontrola pustego zwrotu (0 lub ""), obsługa klawiszy specjalnych (ENTER, BACKSPACE), zabezpieczenie długości bufora.

Szczegółowa analiza problemu

1. Warianty funkcji

  1. INKEY() → zwraca Byte (kod ASCII) pierwszego znaku w sprzętowym buforze UART; 0 gdy bufor pusty.
  2. INKEY$ → zwraca String * 1; pusty string ("") oznacza brak znaku.

2. Algorytm budowania stringu

  1. Deklaruj bufor:
    Dim RxTxt  As String * 64   ' rozmiar dobrać do aplikacji
    Dim ch     As Byte          ' pojedynczy znak – INKEY()
    RxTxt = ""                  ' inicjalizacja
  2. W pętli głównej:
    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
  3. Po wyjściu z pętli RxTxt zawiera kompletny łańcuch.

3. Teoretyczne podstawy

  • INKEY() działa nieblokująco – CPU cyklicznie sonduje rejestr odbiorczy UART.
  • Bufor sprzętowy mikrokontrolera ma zwykle 1 znak (rejestr RDR), dlatego przy dużych prędkościach zaleca się przechwytywanie znaków w przerwaniu i odkładanie do własnego bufora kołowego.
  • Typ String w BASCOM‑AVR zajmuje stałą, statycznie rezerwowaną ilość RAM – przekroczenie deklarowanej długości nadpisze pamięć!

4. Praktyczne zastosowania

  • Terminale tekstowe (np. przez USB‑UART, Bluetooth HC‑05).
  • Konfigurowanie urządzeń w trybie CLI.
  • Odczyt z klawiatury matrycowej (po wcześniejszym umieszczeniu kodu w zmiennej i wywołaniu Inkey()).

Aktualne informacje i trendy

  • BASCOM‑AVR 2.0.8.5 (wyd. 2023) udostępnia funkcję IsCharWaiting() zwracającą liczbę bajtów w buforze programowym, co upraszcza warunek pętli.
  • Coraz częściej stosuje się przerwania UART + bufor kołowy (GetRCV, RxcIsr) zamiast aktywnego polling‑u INKEY(), co poprawia odporność na przepełnienia przy wyższych baudach (115 200+).
  • W projektach niskoenergetycznych popularne staje się wybudzanie MCU przerwaniem RX, a nie pętlą z INKEY().

Wspierające wyjaśnienia i detale

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.


Aspekty etyczne i prawne

  • Odczyt danych użytkownika przez UART jest neutralny etycznie, jednak w aplikacjach komercyjnych należy poinformować o logowaniu przesyłanych danych.
  • Przy komunikacji radiowej (BT, LoRa, Wi‑Fi) obowiązują normy kompatybilności EMC i przepisy RODO, jeśli dane zawierają informacje osobowe.

Praktyczne wskazówki

  1. Aktywne echo znaków (Print Chr(ch);) poprawia ergonomię terminala.
  2. Gdy oczekujesz wyłącznie cyfr lub znaków heks, filtruj je przed doklejeniem – oszczędzasz pamięć i czas parsowania.
  3. Wprowadź timeout:
    Dim t0 As Word : t0 = Timer1          ' Timer1 w ms
    If Timer1 - t0 > 5000 Then Exit Do    ' 5 s bezczynności
  4. W aplikacjach przemysłowych preferuj DMA UART (w nowszych AVR Dx) lub przerwania – zapobiegniesz utracie danych.

Ewentualne zastrzeżenia lub uwagi dodatkowe

  • Polling INKEY() przy wysokim obciążeniu CPU może gubić znaki; wówczas użyj przerwań RX.
  • Typ String spowalnia kod; do dużych ramek (np. JSON) rozważ tablicę Byte i własne zarządzanie indeksem.
  • W starszych kompilatorach (<2.0.7) INKEY$ nie obsługiwał buforu programowego – aktualizacja rozwiązuje problem.

Sugestie dalszych badań

  • Porównaj wydajność: INKEY() polling vs. ISR + RingBuffer (circular queue).
  • Sprawdź bibliotekę MCS RS232.INC – gotowy handler przerwań.
  • Przetestuj funkcję WaitKey (blokująca) i zobacz wpływ na zużycie CPU.
  • Analizuj wpływ długości deklarowanego String na usage RAM w AVR vs. XMEGA.

Krótkie podsumowanie

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ń.

Oceń odpowiedź: 1
Zastrzeżenie: Odpowiedzi udzielone przez sztuczną inteligencję (model językowy) mogą być niedokładne i wprowadzające w błąd. Elektroda nie ponosi odpowiedzialności za dokładność, rzetelność ani kompletność prezentowanych informacji. Wszystkie odpowiedzi powinny być zweryfikowane przez użytkownika.