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

Arduino: Jak poprawnie sprawdzić odpowiedź OK na komendy AT?

Jakub17 23 Maj 2016 19:15 1788 12
  • #1 15694165
    Jakub17
    Poziom 6  
    Posty: 484
    Ocena: 15
    Witam.

    Mam taki kod dzięki któremu uzyskuje odpowiedz zwrotną bluetooth na komendy AT. Chciałem wprowadzic sekcje kodu gdzie, jeśli uzyskana odpowiedz modułu bedzie konkretnym stringiem np. "OK" w odpowiedzi na komende "AT" to pojawi sie komunikat "true", w przeciwnym razie "false". I tu pojawia sie problem bo ciagle dostaje komunikat "false".... Mysle ze sekcja string.equals.string jest w zlym miejscu ale probowalem ją juz umieszczać w kazdym mozliwym miejscu. Na porcie szeregowym otrzymuje odpowiedz "falsefalseOK" czyli ze najpierw Arduino porównuje stringi zanim ten string "OK" został w ogole wydrukowany, a dopiero pózniej drukuje odpowiedź "OK". Wie ktoś jak zrobic zeby ten kod działał poprawnie?

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #2 15694440
    marciniaczekbob
    Poziom 11  
    Posty: 62
    Pomógł: 3
    Ocena: 14
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Chyba powinno być ok, jeżeli nie zadziała, to użyj C-string'a zamiast String.
  • #3 15694526
    Jakub17
    Poziom 6  
    Posty: 484
    Ocena: 15
    Niestety teraz wyświetla się "falsefalse" bez "OK" już nawet

    Dodano po 2 [minuty]:

    Z tym że zauwazyłem że zwraca tyle razy false ile znaków powinna mieć odpowiedź np. odpowiedź "OK" to "falsefalse". Jak wpisze polecenie AT+VERSION to uzyskuje 7 "false" w szeregu
  • #4 15694627
    marciniaczekbob
    Poziom 11  
    Posty: 62
    Pomógł: 3
    Ocena: 14
    marciniaczekbob napisał:
    jeżeli nie zadziała, to użyj C-string'a zamiast String.
  • #5 15695125
    Jakub17
    Poziom 6  
    Posty: 484
    Ocena: 15
    Wstyd się przyznać ale nie umiem się zbytnio posługiwac tym c-stringiem, dodalem go ale nie wiem czy w dobrym miejscu - dodalem go do odpowiedz.c_str() - tylko wtedy program sie kompilował; w innym miejscu dodanie .c_str() powodowalao ze kompilator wywalał blędy. c_str() brałem ją stąd:

    https://www.arduino.cc/en/Reference/CStr

    Niestety nie działa. Teraz na porcie szeregowym nie pojawia się nic kiedy wpisuje komende "AT" :(

    A mam kod:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Mgółbyś to zrobić wedle swojego założenia i dać mi do sprawdzenia czy działa?

    Zrobiłem też tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    i też nie działa:((( zero reakcji na wpisanie komendy "AT"
  • #6 15695999
    marciniaczekbob
    Poziom 11  
    Posty: 62
    Pomógł: 3
    Ocena: 14
    Najpierw naucz się podstaw języka c:
    Link
    Link
  • #7 15696382
    Jakub17
    Poziom 6  
    Posty: 484
    Ocena: 15
    W linkach które podeslales nie ma nic o c_stringach. Wiedza ktora tam jest opisana jest podstawowa i ja posiadam. Natomiast nigdy nie slyszalem o jakis cstringach. Nie da sie tego inaczej zrobic?
  • Pomocny post
    #8 15696726
    marciniaczekbob
    Poziom 11  
    Posty: 62
    Pomógł: 3
    Ocena: 14
    Cytat:
    W linkach które podeslales nie ma nic o c_stringach. Wiedza ktora tam jest opisana jest podstawowa i ja posiadam.

    Masz rację wiedza ta jest podstawowa, aczkolwiek jej nie posiadasz.C-string jest to po prostu tablica znaków char[], która reprezentuje ciąg znaków. Tutaj jest to w miarę dobrze opisane.
    Ostatnio przerobiłem to tak na szybko ( z błędem ). To już musi działać:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dla porównania na C-stringach:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #9 15697075
    Jakub17
    Poziom 6  
    Posty: 484
    Ocena: 15
    Dzięki za poświęcenie, doceniam. Nic tak nie uczy jak przykłady:)
    Ale niestety żaden kod z podanych przez Ciebie nie działa:(

    W przypadku pierwszego jest nadal to samo: reakcja na "AT" to "falsefalse"
    W przypadku kodu z cstringami kompilator sypie błędy:

    na_c_stringu:4: error: expected unqualified-id before '[' token

    na_c_stringu:5: error: expected unqualified-id before '[' token

    In function 'void loop()':

    na_c_stringu:17: error: expected ',' or ';' before 'while'

    na_c_stringu:22: error: 'command' was not declared in this scope

    na_c_stringu:24: error: 'odpowiedz' was not declared in this scope

    exit status 1
    expected unqualified-id before '[' token

    Dodano po 4 [minuty]:

    Wygląda na to jakby zmienne nie zostały zadeklarowane ale przecież napisałeś char...
    A z tym expected unqualified-id before '[' to nie wiem o co chodzi
  • Pomocny post
    #10 15697362
    marciniaczekbob
    Poziom 11  
    Posty: 62
    Pomógł: 3
    Ocena: 14
    przy int i=0 dodaj średnik w drugim
  • #11 15697409
    Jakub17
    Poziom 6  
    Posty: 484
    Ocena: 15
    Poprawiłem jeszcze tablice, bo najpierw dales jej rozmiar a pozniej nazwe ale i tak nie do końca działa poprawnie... No i zamieniłem "true" "false" na "1" i "0" dla wygody.
    Zmodyfikowałem trochę Twój kod - nawiasy klamrowe obejmowały złe obszary przy ifach i teraz uzyskuje komunikat "11" po wspisaniu "AT" . Zatem już prawie sukces tylko chce żeby wyświetlała się odpowiedź na komende AT czyli "OK" a dopiero później pojedyncze "1" . Wiesz jak to zrobić?

    Dodałem jeszcze nawiasy klamrowe do if(command[0]...) i else oraz zrobiłem to na diodach i komunikatach "0" i "1". Jest jedno ale...
    Wszystko fajnie już działa, diody się palą tylko na samym początku występuje jedno zabłąkane 0 i uzyskuje komunikat "01" a później już wraz z kolejnymi komendami "AT" leci "11" i dioda się pali. Wiesz jak pozbyć się tego "01" na początku?

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #12 15698274
    marciniaczekbob
    Poziom 11  
    Posty: 62
    Pomógł: 3
    Ocena: 14
    Nie wiem, musisz otrzymywać jakiś komunikat na seriala. Sprawdź jaki.
    Tak na marginesie to sorry za te błędy, dawno nie pisałem w c.
  • #13 15698561
    Jakub17
    Poziom 6  
    Posty: 484
    Ocena: 15
    To wyświetlanie "OK" to już sprawa drugorzędna. Muszę tylko zwalczyć jakoś te "01" jakoś... Ogólnie to będzie część wykonawcza innego programu. Chcę zrobić zamek który będzie się otwierał automatycznie po złapaniu zasięgu z przypisanym mu urządzeniem o konkretnym adresie MAC, więc nie mogą się pojawiać takie zaburzenia... Po usprawnieniu kodu występują one tylko przy przejściu z nieprawidłowych komend ("0") na prawidłowe komendy ("1"), nigdy odwrotnie... Myślę że to może być coś z indeksowaniem tablicy bo każda "jedynka" lub "zero" jest przypisane do jednego znaku, zatem na początku dla danych indeksów tylko pierwsze znaki się nie zgadzają a później już leci...Gdybyś wpadł jakoś na pomysł jak to załatwić, to podziel się. W każdym razie dzięki, i tak dużo mi pomogłeś:)

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik ma problem z kodem Arduino, który ma na celu sprawdzenie odpowiedzi "OK" na komendy AT wysyłane do modułu Bluetooth HC-06. Mimo poprawnego ustawienia kodu, użytkownik otrzymuje nieprawidłowe odpowiedzi "false" zamiast oczekiwanego "true". W dyskusji zaproponowano użycie C-stringów zamiast obiektów String, co miało na celu poprawienie porównania odpowiedzi. Użytkownik zmodyfikował kod, ale nadal napotykał problemy z wyświetlaniem odpowiedzi oraz z niepożądanym "0" na początku komunikatów. Ostatecznie, użytkownik dąży do stworzenia systemu automatycznego zamka, który będzie reagował na odpowiednie komendy.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA