logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Atmega328p-pu,RS232[C,avr-gcc] - Zastępowanie odebranych danych.

lbrycht 26 Wrz 2013 14:54 2391 14
REKLAMA
  • #1 12779656
    lbrycht
    Poziom 8  
    Witam,

    Odbieram dane z kompasu przez terminal w sposób taki, że wyświetlane są kolejne wartości po okresie odświeżania jako powiększająca się lista nowych azymutów(kątów).

    Chciałbym, aby w terminalu był wyświetlany tylko jeden kąt zmieniający się co okres odświeżania, tzn aby nowa wartość zastępowała starą.

    Jak się do tego zabrać?
  • REKLAMA
  • #2 12779711
    lycon5
    Poziom 11  
    Nie wystarczy komenda czyszcząca ekran w terminalu ?
  • REKLAMA
  • #3 12779734
    lbrycht
    Poziom 8  
    A co to za komenda którą mogę wgrać do Atmegi?
  • #4 12779777
    tmf
    VIP Zasłużony dla elektroda
    To nie takie proste. To jak to uzyskać zależy od terminala, który emulujesz na PC. Przykładowo zwykły terminal powinien interpretować kody:
    http://en.wikipedia.org/wiki/ANSI_escape_code
    Ale jeśli podłączysz się do portu programem, który tych kodów nie interpretuje zobaczysz krzaki i nici z formatowania. Można by spróbować zaimplementować jakiś protokół typu telnet - ale to mimo wszystko trochę zabawy.
  • REKLAMA
  • #5 12779911
    lbrycht
    Poziom 8  
    Jak to zaimplementować w języku C?

    poprzez #define

    a później użycie zdefiniowanej wartości/kodu?

    Wolałbym uniknąć stosowania protokołu telnet.
  • REKLAMA
  • #6 12780184
    BlueDraco
    Specjalista - Mikrokontrolery
    Jeśli chodzi tylko o jeden wiersz, to wystarczy wysłać CR bez LF (i oczywiście ustawić terminal tak, żeby nie robił sam LF po CR).
  • #7 12780300
    lbrycht
    Poziom 8  
    W jaki sposób zadeklarować to w terminalu?
  • #8 12780385
    BlueDraco
    Specjalista - Mikrokontrolery
    Jeśli nie wiesz, jak to zrobić, to znaczy, że nie ustawiłeś "dobijania" LF po CR, więc terminal nie dobija.
  • #9 12780397
    lbrycht
    Poziom 8  
    I dlatego ciągle mimo wszystko wyrzuca mi listę zamiast jednej zmieniającej się linii?
  • #10 12781527
    BlueDraco
    Specjalista - Mikrokontrolery
    Nie, wyrzuca wiele linii, bo każdą linię kończysz kodem CR + LF, zamiast samym CR. Ponieważ nie pokazałeś programu, możemy tylko gdybać.
  • #11 12782694
    lbrycht
    Poziom 8  
    Oto fragment kodu:

    
    	double pozycja = atan2(yo,xo);
    	double deklinacja =4.363 / 1000.0;
    	pozycja += deklinacja;
    	
    if (pozycja<0) pozycja+=2*PI;
    
    if (pozycja >2*PI) pozycja-= 2*PI;
    	
    double stopnie = pozycja * 180/PI ;
    
    	
    	int wyslanie = stopnie;  
    	
    	printf("\r%i ",wyslanie);
    
  • #12 12785948
    lycon5
    Poziom 11  
    Jakiego terminala używasz w ogóle ? Putty czy może sam coś napisałeś ? Co prawda nie ma komendy czyszczącej cały ekran ale zawsze możesz wykonać powrót karetki ('\r') nadpisać spacjami całą linię, znowu cofnąć karetkę i wysłać kolejne dane :)
  • #13 12788141
    sweter_007
    Poziom 14  
    Jeśli jesteś w stanie napisać i wgrać program do atmegi to tym bardziej napisać własny 'terminal'. To tylko kilka linijek kodu w dowolnym języku programowania...
  • #14 12789599
    lbrycht
    Poziom 8  
    Mam napisany terminal, oraz sprawdzałem działanie programu w Terminal v1.9b. Ten napisany przeze mnie odbiera dane lecz pojawia się problem bo po odebraniu kilku linijek pole do odbioru się zapełnia i przestaje odbierać dane. Może pokaże graficznie:
    Atmega328p-pu,RS232[C,avr-gcc] - Zastępowanie odebranych danych.

    Zależy mi na tym abym miał jedną linię z jednym azymutem, ponieważ chce tą wartość dalej wykorzystać do obracania bitmapy.
  • #15 12791768
    sweter_007
    Poziom 14  
    Jeśli wysyłasz: printf("\r%i ",wyslanie); to jak myślisz co oznacza "\r" bo prawdopodobnie nową linie.
    Spróbuj tak: printf("%i ",wyslanie);
    Po drugie weź na Terminal v1.9b sprawdź czy cały czas odbierasz prawidłowe dane.
    Jeśli w trybie string każda dana przychodząca wyświetlana jest w nowej linii to wysyłasz dodatkowo znaki specjalne.
    Po trzecie:
    string s;
    textbox.text = s;
REKLAMA