Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

AVR UART - Jak wysłać znaki specjalne do terminala (Putty)

m72 18 Wrz 2016 03:51 3339 49
  • #1 18 Wrz 2016 03:51
    m72
    Poziom 12  

    Męczę sobie bibliotekę terminalową, wszystko niby działa ale nie wiem jak robić tabelki ze znaków specjalnych, cały czas zamiast znaków mam pytajniki.
    Zmieniałem w Putty chyba wszystkie możliwe kodowania znaków i nic to nie daje.
    Jak tą sprawę rozwiązać ?

    Kod: c
    Zaloguj się, aby zobaczyć kod
    AVR UART - Jak wysłać znaki specjalne do terminala (Putty)

    0 29
  • #2 18 Wrz 2016 10:05
    BlueDraco
    Specjalista - Mikrokontrolery

    Ustaw tryb emulacji terminala na ANSI, VT100 lub coś podobnego. Na znaki semigraficzne niekoniecznie musi to pomóc, ale sekwencje sterujące przejdą. Zwróć uwagę, że użycie w łańcuchach w C znaków spoza zakresu ASCII (czyli np. semgraficznych) daje efekty specyficzne dla kompilatora - jest to poza standardem języka.

    0
  • #3 18 Wrz 2016 10:10
    2675900
    Użytkownik usunął konto  
  • #4 18 Wrz 2016 10:24
    grko
    Poziom 33  

    @Piotrus_999 A gdzie niby masz coś takiego: '╔' lub '═'w tablicy ASCII? Do obsługi multibyte characters używa się typu wchar_t.

    0
  • #5 18 Wrz 2016 12:02
    2675900
    Użytkownik usunął konto  
  • #6 18 Wrz 2016 14:45
    m72
    Poziom 12  

    No ale nigdzie w Putty ani w Realtermie nie ma opcji emulacji VT100.
    Wiem tylko że podobny problem jest w Midnight Commanderze pod linuxem z ramkami ale wystarczy zmienić kodowanie znaków i wszystko gra.
    Wchar_t -> gdzie coś o tym znajdę w kontekście avr ?
    Co do sekwencji sterujących to raczej przechodzą bo działa sterowanie pozycją kursora, zmiana koloru fonta i tła.

    0
  • #7 18 Wrz 2016 15:09
    2675900
    Użytkownik usunął konto  
  • #8 19 Wrz 2016 00:54
    m72
    Poziom 12  

    No dobra, ale tak bez filozofii bo nie kumam.
    Co poprawić i jak żeby te znaki były widoczne w terminalu ?

    0
  • #9 19 Wrz 2016 01:23
    piotrva
    Moderator na urlopie...

    1. Najlepiej użyć znaków ze standardu ASCII takich jak + i | oraz -.
    2. Znaki semigraficzne mogą Ci ginąć na 2 etapach: albo kompilator Ci je koduje w inny sposób, niż byś chciał, albo terminal inaczej je wyświetla. Pamiętam, że przy drukarkach igłowych takie rzeczy sprowadzały się do wyboru odpowiedniej strony kodowej/zestawu znaków (charset). I między tymi zestawami były właśnie różnice dla znaków >127. Np. jeden zestaw zawierał polskie znaki, inny semigraficzne, inny matematyczne. Jeśli się upierasz na takie rysowanie - musisz poszukać odpowiedniego oprogramowania po stronie komputera, które dobrze wyświetli te znaki, lub ewentualnie znaleźć do jakiegoś istniejącego (np. RealTerm) odpowiednią czcionkę, zawierającą szkielety tabelek dla znaków o kodach >127.

    0
  • #10 19 Wrz 2016 07:27
    435758
    Użytkownik usunął konto  
  • #11 19 Wrz 2016 08:14
    2675900
    Użytkownik usunął konto  
  • #12 19 Wrz 2016 08:29
    BlueDraco
    Specjalista - Mikrokontrolery

    Realterm ma tryb ANSI. Putty ma kilka trybów zgodnych z ANSI/VT100. Zajrzyj do menu, zanim skrytykujesz przyzwoity program.

    0
  • #13 20 Wrz 2016 18:20
    m72
    Poziom 12  

    Dalej nic. Spróbowałem w ustawieniach wszystkie opcje z poniższego obrazka.
    AVR UART - Jak wysłać znaki specjalne do terminala (Putty)

    Wysyłająć takie coś

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Otrzymuję
    AVR UART - Jak wysłać znaki specjalne do terminala (Putty)

    Teraz jest ustawione kodowanie Windows 1250 to przynajmniej polskie znaki działają.

    Jak ktoś wie jak to naprawić to proszę o pomoc.

    0
  • #15 20 Wrz 2016 19:07
    2675900
    Użytkownik usunął konto  
  • #17 20 Wrz 2016 19:56
    m72
    Poziom 12  

    (Piotrus_999) nie kumam cie. Co to znaczy "Wyślij sobie znaki > 127 na wyswietlacz i zobacz gdzie są graficzne." Jaki wyświetlacz ? Jakie graficzne ?
    Ja to robię tak że kopiuje je bezpośrednio z tablicy znaków windowsa do kodu programu. Jak ktoś zna inny sposób, np jakimś magicznym kodem to niech się podzieli, ale konkretnie, bez filozofii.
    (Grko) jak można zmienić kodowanie znaków w Atmel Studio ?

    0
  • #18 20 Wrz 2016 20:09
    grko
    Poziom 33  

    @m72 Nie używam atmel studio więc nie wiem. Kodowanie pliku możesz sobie sprawdzić za pomocą windowsowego notatnika albo Notepad++. Szczerze mówiąc to nie robiłem nigdy wyświetlania tego typu znaków więc nie pomogę więcej.

    0
  • #19 20 Wrz 2016 20:10
    piotrva
    Moderator na urlopie...

    m72 napisał:
    (Piotrus_999) nie kumam cie. Co to znaczy "Wyślij sobie znaki > 127 na wyswietlacz i zobacz gdzie są graficzne." Jaki wyświetlacz ? Jakie graficzne ?
    Ja to robię tak że kopiuje je bezpośrednio z tablicy znaków windowsa do kodu programu. Jak ktoś zna inny sposób, np jakimś magicznym kodem to niech się podzieli, ale konkretnie, bez filozofii.

    Znaki w kodzie ASCII są zapisane jako bajty, zatem każdy znak ma jakąś wartość liczbową mu odpowiadającą - koledze chodzi (i mówi to bez filozofii) o wysłanie znaków o kodach od 128 do 255. W ciąg znaków można je wprowadzić za pomocą zapisu typu: "napis \xAB" gdzie zamiast AB podajesz po prostu kod heksadecymalny danego znaku.

    Zaleta tego rozwiązania to niezależność od kompilatora i kodowania dokumentu.

    0
  • #20 20 Wrz 2016 20:39
    grko
    Poziom 33  

    @piotrva Znaki '╔' lub '═' nie są z zakresu 128 do 255. Moim zdaniem najlepiej kodować plik źródłowy w UTF-8 (tak jak w putty) albo używać raw hex values.

    0
  • #21 20 Wrz 2016 20:47
    2675900
    Użytkownik usunął konto  
  • #22 20 Wrz 2016 21:36
    grko
    Poziom 33  

    @Piotrus_999 Widzę, że nie bardzo rozumiesz o co chodzi więc proponuję sprawdzić wynik działania programu:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    nadal twierdzisz, że kodowanie tych znaków nie ma nic do rzeczy?

    0
  • #23 20 Wrz 2016 21:59
    2675900
    Użytkownik usunął konto  
  • #24 20 Wrz 2016 22:10
    grko
    Poziom 33  

    Piotrus_999 napisał:

    Nie wiem o co Ci chodzi. Piszemy o VT100 lub emulacji VT100 nie o Windows.


    Jaki windows? Człowieku, rozumiesz co to kodowanie znaków?

    Piotrus_999 napisał:

    Jeżeli putty emuluje poprawnie VT100 to powinien wyświetlać znaki tak jak to było w VT100. Jezeli putty robi to inaczej to znaczy, że nie emuluje poprawnie VT100.


    Rozumiesz pytanie autora? Pyta się dlaczego nie wyświetlają się ╔ oraz ═?


    Piotrus_999 napisał:

    Twój przykład jest z założenia zły gdyż w podstawowym zestawie znaków nie ma podwójnych znaków ramek (jak na załaczonym obrazku w poprzenim poście), a cokolwiek wyświetli się Twoim programem - co to wspólnego z VT100?


    Bo dokładnie o te znaki pyta autor? (DLACZEGO nie wyświetla się ╔ oraz ═).

    Cytat:

    Ale proszę bardzo - tu masz 2 stringi w AS7


    To płyną dla Ciebie z tego jakieś wnioski dlaczego to nie działa?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    I czy nadal Twierdzisz że ╔ oraz ═ są z zakresu 128 do 255? Oraz, że takie wartości wysyła MCU do terminala?


    Cytat:

    Emulator VT100 jak dostanie byte 167 np to ma (o ile oczywiście jest właczony podstawowy zestaw znaków) wyśwetlić ß


    Bingo Sherlocku. Tylko zamiast właściwego kodu znaku ╔ wysyłana jest wartość 3 bajtowa (dla UTF-8) i dlatego terminal ma problemy z wyświetleniem tego.

    0
  • #25 20 Wrz 2016 22:34
    2675900
    Użytkownik usunął konto  
  • #26 20 Wrz 2016 22:47
    grko
    Poziom 33  

    Piotrus_999 napisał:

    grko napisał:
    Bingo Sherlocku. Tylko zamiast właściwego kodu znaku ╔ wysyłana jest wartość 3 bajtowa (dla UTF-8) i dlatego terminal ma problemy z wyświetleniem tego.

    Czy Ty się dobrze czujesz? I przestań sie wreszcie mądrzyć - jak drogi Watsonie to wyśle 3 bajty?
    Kod: c
    Zaloguj się, aby zobaczyć kod


    No ile niby wynosi według Ciebie strlen("╔")?

    0
  • #27 20 Wrz 2016 22:54
    2675900
    Użytkownik usunął konto  
  • #28 20 Wrz 2016 23:30
    m72
    Poziom 12  

    Panowie błagam !
    Może zadam pytanie jeszcze raz w formie graficznej :)
    AVR UART - Jak wysłać znaki specjalne do terminala (Putty)
    Ja to zadziała to dalej sobie poradzę :)

    0
  • #29 20 Wrz 2016 23:35
    2675900
    Użytkownik usunął konto  
  • #30 21 Wrz 2016 00:22
    m72
    Poziom 12  

    Nie mogę pojąć jak to jest możliwe żeby nie dało się wyświetlić ramek w terminalu.
    Po zastosowaniu twojej pętli wyświetliły się znaki ale tam nie ma w ogóle "ramkoznaków" (w sumie nie może ich tam być bo i skąd)
    AVR UART - Jak wysłać znaki specjalne do terminala (Putty)

    Dodano po 3 [minuty]:

    A jednak jest możliwe tylko jak ?
    Domyslam się że to jest dzieło jednego z forumowiczów :D

    Link


    Dodano po 4 [minuty]:

    Na stronie projektu widać w kodzie że ramki są wstawiane na żywca ! :D
    Pięknie to śmiga.

    0