eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaBiblioteka MQTT i dziwny kod w CRe: Biblioteka MQTT i dziwny kod w C
  • Data: 2022-08-10 00:06:33
    Temat: Re: Biblioteka MQTT i dziwny kod w C
    Od: Atlantis <m...@w...pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    Sprawa ciągle nie daje mi spokoju, wiec przyjrzałem się jeszcze raz
    trochę bliżej działaniu funkcji MQTTReadPacket(). Nadal nie wiem jak
    rozwiązać problem, ale sprawa przynajmniej się trochę wyjaśniła.

    W uproszczeniu korzystanie z tej funkcji wygląda następująco:

    case MQTT_CONNECT_ACK
    WORD len = MQTTReadPacket();
    if (len >= 2) {
    //Tutaj wykonują się główne operacje
    //Tylko tutaj może zostać zmieniony stan maszyny stanów
    }
    break;

    Funkcja może być wywołana w tym miejscu wielokrotnie i dalej przejdziemy
    dopiero wtedy, gdy zwróci ona dwa lub więcej (wartość ta oznacza liczbę
    bajtów zapisanych do bufora). Sama funkcja MQTTReadPacket również
    posiada swoją własną maszynę stanów, której wartość jest zapisywana w
    lokalnej zmiennej statycznej. Od stanu tej maszyny zależy co funkcja zwróci.

    Dopisałem do kodu kilka printf-ów, żeby zobaczyć co się tam dzieje.
    Wynik wygląda następująco:

    Tutaj wywolujemy MQTTReadPacket() w MQTT_CONNECT_ACK
    m_state=0 <- stan po wywołaniu funkcji w MQTT_CONNECT_ACK
    len=2 <- wartość zwrócona

    Tutaj wywołania w innych częściach programu
    m_state=2
    m_state=3
    m_state=0

    Tutaj wywolujemy MQTTReadPacket() w MQTT_CONNECT_ACK
    m_state=2 <- stan po wywołaniu funkcji w MQTT_CONNECT_ACK
    len=0 <- wartość zwrócona

    Tutaj wywolujemy MQTTReadPacket() w MQTT_CONNECT_ACK
    m_state=3 <- stan po wywołaniu funkcji w MQTT_CONNECT_ACK
    len=0 <- wartość zwrócona

    Tutaj wywolujemy MQTTReadPacket() w MQTT_CONNECT_ACK
    m_state=0 <- stan po wywołaniu funkcji w MQTT_CONNECT_ACK
    len=2 <- wartość zwrócona

    Tutaj wywołania w innych częściach programu
    m_state=2
    m_state=3
    m_state=0


    Jak widać maszyna stanów przy kolejnych wywołaniach funkcji
    MQTTReadPacket() posiada wartości 0, 2 albo 3.
    Jeśli funkcja zostanie wywołana gdy jej maszyna będzie w stanie 0, to
    zwrócona zostanie wartość 2 - spowoduje to, że będziemy mogli wejść do
    ifa i wykonać operacje przewidziane dla MQTT_CONNECT_ACK.
    Jeśli jednak w momencie wywołania funkcji jej maszyna stanów będzie
    ustawiona na 2 albo 3, zwrócone zostanie zero. If się nie wywoła, a wiec
    nie opuścimy MQTT_CONNECT_ACK i wrócimy do tego samego miejsca w
    kolejnym obiegu pętli.

    Co więcej - wywołania MQTTReadPacket w innych miejscach programu również
    biorą udział w tym cyklu.

    Kolejny wniosek jest taki, że "magiczne liczby" w switch/case wewnątrz
    MQTTReadPacket to tak naprawdę kolejne etapy pracy maszyny stanów tej
    funkcji.

    Więc główny problem polega teraz na tym, żeby w tym miejscu nie było
    zwracane 2, ale 4. Do MQTTBuffer powinny trafiać cztery bajty, a
    ostatnio z nich będzie kodem wyniku, przesyłanym w pakiecie CONNACK.
    Konieczna będzie dokładniejsza analiza tego, co właściwie ta funkcja
    robi. :)

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: