Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

HammerHead

Arduino

Polecane posty

Jeżeli ktoś miał z tym cudakiem do czynienia, to proszę o pomoc.

Wysyłam do Arduino strumień danych w formacie "B <wartość>" i chciałbym napisać odpowiedni program, by zczytywał te dane i regulował np. natężenie oświetlenia LEDa. Jak to zrobić?

0 odpowiedzi >

:D

Link do komentarza
Udostępnij na innych stronach

Ze światełkami już potrafię czynić cuda (zrobiłem światła pozycyjne, stroboskopy i beacon samolotu! :D), ale nadal nie wiem jak odbierać dane z komputera z portu COM5 pod którym mam to urządzenie. A LED był tylko prostym przykładem, docelowo ta "zabawka" (200zł to sporo jak na zabawkę :P) ma sterować siłownikami hydraulicznymi.

Link do komentarza
Udostępnij na innych stronach

Skoro temat jeszcze otwarty, to zapytam o coś innego. Udaje mi się eksportować jedną oś i definiować sygnały wyjścia. Docelowo ma być ich od 2 do 13. Problem w tym, że na razie potrafię "łapać" tylko jeden, i to dość prostym kodem. Jak eksportować do trzech różnych zmiennych wartości ze strumienia danych z COM? Szukałem na tych stronkach z tutorialami i nie znalazłem (a raczej - zapewne przeoczyłem) kod, który jest mi potrzebny. Mam coś takiego:

incB = Serial.read()

Czyli zmienna incB przyjmuje wartość która została ostatnio odczytana z portu COM. Jak przetworzyć tą zmienną, by powstały z niej trzy inne?

Link do komentarza
Udostępnij na innych stronach

Opracować protokół transmisji.

Nie wiem jaki masz port szeregowy i jakie masz potrzeby, ale:

Bajt preambuły np. 0xAA

Bajt z rozmiarem danych

Dane

Bajt sumy kontrolnej.

char readBuffer[16];
CyclicBuffer<char> cyclilcBuffer;

while (1) //Pętla główna wątku.
{
   while (false == cyclicBuffer.empty()) //Dopóki mamy dane do analizy
   {
      if (0xAA != cyclicBuffer[0]) //szukamy preambuły
      {
         cyclicBuffer.pop_front(); // Dane przed preambułą wywalamy
      }
      else
      { //Znalezliśmy preambułę,
         if (2 > cyclicBuffer.size()) //ale mamy za mało danych,
         {
            break; // więc czekamy na dane
         }
         else // mamy dość danych aby zacząć analizę,
         {
            int size = cyclicBuffer[1];
            if (3 + size > cyclicBuffer.size())
            {
               break; // ale jednak za mało aby dokończyć
            }
            else
            {
               if (false == crc(cyclicBuffer)) //sprawdzamy czy suma kontrolna się zgadza.
               {
                  cyclicBuffer.pop_front(); // Nie zgadza się, wywalamy fałszywą preambułę.
               }

               std::vector<char> msg; //Zgadza się, to prawie na pewno jest ramka danych
               msg.resrve(size);
               for (unsigned it i = 0; i < size; ++i)
               {
                  msg.push_back(cyclicBuffer[i + 2]);
               }

               callBack(msg); //Zgłaszamy użytkownikowi coś co według nas jest danymi na które czekał.

               cyclicBuffer.pop_front(3 + size); //Usuwamy z bufora cyklicznego przeanalizowane dane.
            }
         }
      }
   }

   int read = Serial.read(readBuffer, 6); //6 to spodziewana liczba bajtów

   if (0 != read)
   {
      for (unsigned int i = 0; i < read; ++i)
      {
         cyclicBuffer.push_back(readBuffer[i]);
      }
   }
   else
   {
      //Czyżby jakiś błąd ? A może nie blokujące wywołania ?
   }
}

Tak ja to robię w C++ na PC, gdzie odczyt danych z portu szeregowego jest blokujący, mam ogromną moc i wielordzeniowy procesor, który bardzo dobrze radzi sobie z ifami.

Link do komentarza
Udostępnij na innych stronach



  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...