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

[ATmega128][C][VBA] jak odebrać stringa?

owenpe 19 Sty 2010 20:39 1214 8
REKLAMA
  • #1 7560363
    owenpe
    Poziom 17  
    Skonfigurowałem sobie na ATmedze USARTa i pięknie wysyła dane:) w programie do kontrolera biorę sobie liczbę unsigned int i za pomocą itoa zamieniam ją na stringa. Nie wiem jak teraz odebrać te dane w Visual Basicu. Wcześniej robiłem to tak:

    Do
    DoEvents
    Loop Until MSComm5.InBufferCount >= 8
    TextBox1.Value = MSComm5.Input

    Czekałem aż w buforze wejściowym będzie 8 bitów i wtedy wpisywałem je na textboxa. Tu zawsze odbierałem 8 bitów, a teraz będzie ich od 1 do 4. Jak w takim razie mam odebrać liczbę? Czy muszę najpierw wysłać informację o długości nadchodzącej liczby i dopiero później ją samą czy jest może jakiś inny sposób?
  • REKLAMA
  • #2 7560666
    Kabuto15
    Poziom 19  
    Hmm... Bit a bajt to znaczna różnica. W buforze znakowym MSComm5.InputBufferCounter masz liczbę bajtów a nie bitów.
    Sprecyzuj zapytanie.
  • REKLAMA
  • #3 7561149
    owenpe
    Poziom 17  
    Już precyzuje:) Zamieniam sobie liczbę 10bitową na stringa za pomocą itoa i wysyłam za pomocą USARTa. I chce to teraz odebrać, tylko nie wiem jak. Po konwersji string może mieć od 1 do 4 znaków i nie wiem jak to zadeklarować. Wcześniej zbierałem 8 bajtów (zawsze 8) i po zebraniu ich wpisywałem do textboxa. Teraz mam od 1 do 4 znaków. Czy muszę najpierw wysyłać info o długości stringa, a później samego stringa czy można to zrobić jakoś inaczej?
  • REKLAMA
  • #4 7561497
    Kabuto15
    Poziom 19  
    Możesz wysyłać liczbę w postaci szestnastkowej i dopełniać zerami z lewej np. 0EF, 100 etc. Wtedy zawsze będziesz odbierał 3 znaki.
  • #5 7562144
    owenpe
    Poziom 17  
    Ale jeśli tak zrobię, to i tak będę musiał ją później przekonwertować w vba na decymalną, a jak przeglądam funkcje konwertujące w vba, to nie widzę takiej :/
  • #6 7562185
    Kabuto15
    Poziom 19  
    A funkcja CDec ?

    EDIT:
    A jeśli już chodzi o samo wysyłanie i odbieranie. Jeśli masz zmienną liczbę znaków, a chcesz to czymś terminować to najlepiej użyj znaku CR (0x0D, carriage return) po każdym wysłanym komunikacie. W programie natomiast sprawdzasz czy taki znak otrzymano, jeśli tak konwertujesz liczbę i czyścisz bufor odbiorczy, jeśli nie dopisujesz znaki i czekasz.
  • REKLAMA
  • #7 7562242
    owenpe
    Poziom 17  
    No właśnie myślałem o tej funkcji, ale trochę zmylił mnie jej opis:/ Znalazłem w necie, że:

    Funkcja CDec konwertuje wprowadzone wyrażenie do typu Decimal.
    Składnia funkcji CDec:
    CDec(Wyrażenie)
    Argument Wyrażenie jest wymagany. Może to być dowolne poprawne wyrażenie numeryczne w zakresie +/-79,228,162,514,264,337,593,543,950,335 dla liczb bez miejsc dziesiętnych. Dla liczb z 28 miejscami dziesiętnymi: +/-7.9228162514264337593543950335. Najmniejsza liczba niezerowa: 0.0000000000000000000000000001.

    Argumentem musi być wyrażenie numeryczne, a ja wysyłam stringa, więc ta opcja chyba odpada:/

    Ale ten pomysł ze znakiem CR mi się podoba:D zaraz go przetestuję :)

    EDIT:
    No nadal jest coś ni halo:/
    Po stronie ATmegi wygląda to tak:

    int i=999;
    char buffer [33];
    itoa (i,buffer,10);
    uart_puts(buffer);
    uart_putc(0x0D);

    Po stronie kompa i VBA tak:

    Do
    DoEvents
    Loop Until MSComm5.Input <> CR
    TextBox1.Value = MSComm5.Input

    I do pola tekstowego wpisuje mi tylko pierwszą cyfrę 9 zamiast 999 :/

    A jak łączę ATmegę z HyperTerminalem, to wyświetla mi 999 i kursor wraca do początku, czyli jest ok. Sprawdzałem też polecenia ETX (0x03) i EOT (0x04). One też nie pomogły:/ Wyświetlał mi się tylko pierwszy znak.
  • Pomocny post
    #8 7562599
    Kabuto15
    Poziom 19  
    owenpe napisał:

    Po stronie kompa i VBA tak:

    Do
    DoEvents
    Loop Until MSComm5.Input <> CR
    TextBox1.Value = MSComm5.Input

    I do pola tekstowego wpisuje mi tylko pierwszą cyfrę 9 zamiast 999 :/

    Gdybyś wysłał ciąg 123 to otrzymał byś w polu tekstowym nie pierwszą, a ostatnią liczbę, gdyż tylko ona jest tam wpisywana. Dlaczego? Bo nie dopisujesz do TextBoxa odebranych znaków. Pomiędzy DoEvents a Loop powinieneś wstawić dopisywanie do Textboxa kolejnych znaków. Rozwiązanie:
    TextBox1.Value = TextBox1.Value + MSComm1.Input
  • #9 7562711
    owenpe
    Poziom 17  
    A no tak, wiedziałem, że to musi być jakiś głupi błąd :) dzięki za pomoc :)
REKLAMA