Arduino Hello World na monitorze szeregowym

Cześć, zostaliśmy poproszeni o zaprogramowanie czegoś, co kiedy wpisuję coś na monitorze szeregowym, drukuje Witaj świecie, ale haczyk to tylko drukuje hello world pod warunkiem, że dane wejściowe w monitorze szeregowym to 3-bitowe dane wejściowe, a następnie muszę mieć kod, który uniemożliwia ciągłe drukowanie. moim jedynym problemem jest to, że tak naprawdę nie wiem, jak policzyć liczbę bitów danych wejściowych, a także zatrzymać ciągłe drukowanie.

void setup() { Serial.begin(9600); } void loop() { String readSerial; String input; while(Serial.available() > 0){// put your main code here, to run repeatedly: delay(2); input.concat(String((char)Serial.read())); return input; } Serial.println("HELLO WORLD"); } 

Komentarze

  • Czy to jest zadanie dla klasy szkolnej?
  • Proszę dodać swój kod.
  • Tak. A także zadanie przed właściwą lekcją
  • Co dokładnie masz na myśli mówiąc o 3-bitowym wejściu? Interfejs szeregowy wysyła tylko całe bajty. Czy chodzi o konkretne wartości w 3 z 8 bitów pojedynczego bajtu?
  • jest tu napisane, że 3 znaki gotowe do odczytu (bajty) to 3 bity? Czy moje założenie jest błędne?

Odpowiedź

Sądząc po komentarzach, brakuje Ci podstawowej wiedzy. Aby naprawdę dowiedzieć się, czego powinieneś się nauczyć w tym zadaniu, przejrzyj swoje materiały szkoleniowe lub samouczki C / C ++ i Arduino w Internecie . Tutaj podam tylko kilka wskazówek dotyczących rozumowania, które mogą pomóc w rozwiązaniu zadania przypisanego. (Niestety w końcu nie jest jasne, na czym dokładnie polega zadanie)

  • Interfejs Serial Arduino (interfejs UART) wysyła dane w bajtów, pojedynczo i po kolei (stąd nazwa serial). 1 bajt to seria 8 bitów, z których każdy ma wartość 1 lub 0. Razem 8 bitów tworzy wartość, którą można również wyrazić jako wartość dziesiętną od 0 do 255. Na przykład 01001011 jest binarnym odpowiednikiem liczby dziesiętnej 75. (W celu uzyskania dalszych wyjaśnień wyszukaj w Google binarny system liczbowy). Dane bajtowe mogą być również wyrażone jako znaki, zgodnie z definicją w standardzie ASCII. Każda wartość binarna odnosi się do określonego znaku. Tak dzieje się w szeregowym monitorze środowiska Arduino IDE. (Więcej wyjaśnień w Google ASCII)
  • Ponieważ dane są przesyłane szeregowo, mogą wystąpić pewne opóźnienia w transmisji, które są niezauważalne dla ludzi, ale Arduino jest wystarczająco szybkie, aby Serial.available() może zwrócić 0, ponieważ w tym momencie nastąpiło niewielkie opóźnienie w transmisji. Dlatego ważne jest, aby uchwycić całą wiadomość, zanim spróbujesz z nią pracować. Można to zrobić albo zliczając bajty (czekając, aż w buforze będą dostępne co najmniej 3 bajty) lub oznaczając koniec wiadomości specjalnym znakiem (na przykład znakiem nowej linii „\ n”). W sieci jest wiele samouczków, jak to zrobić. Możesz zacząć od bloga Majenko .
  • Możesz sprawdzić liczbę odebranych bajtów, zwracając wartość Serial.available(). Zwróci 3, gdy w buforze będą 3 gotowe do odczytu bajty.
  • Jeśli zdefiniujesz zmienną wewnątrz void loop(), zostanie wyrzucony po zakończeniu funkcji i przedefiniowany, gdy funkcja zostanie uruchomiona ponownie (w świecie Arduino funkcja void loop() jest wywoływana raz po raz na zawsze) . Utracisz całą zawartość, która została zapisana w tej zmiennej. Jeśli chcesz utrwalać dane podczas wykonywania funkcji void loop(), możesz zdefiniować zmienną poza jakąkolwiek funkcją w na początku programu. Ta zmienna jest wtedy globalna i zostanie zdefiniowana tylko raz na początku programu i będzie przechowywana przez cały okres istnienia programu.
  • Jak napisano w komentarzu, nie należy zwracać wartości z funkcji void, s ince void oznacza głównie, że nie ma wartości zwracanej. Powrót z funkcji void loop() spowoduje tylko ponowne uruchomienie tej funkcji (ponieważ jesteśmy w świecie Arduino).
  • Możesz porzucić delay(2). Nie ma takiej potrzeby. A jeśli działa tylko z opóźnieniem, oznacza to, że coś innego nie jest poprawne i pracujesz z objawami zamiast z prawdziwym problemem.

Ponadto nie powinieneś próbować budować wszystkiego na swoim posiadać i wynaleźć koło na nowo. Zamiast tego spróbuj spojrzeć na przykłady, które są dostarczane z Arduino IDE. Na przykład SerialEvent przykład, który pokazuje, jak odebrać wiadomość szeregową (zakończoną znakiem nowego wiersza „\ n”). Spójrz także na inne powiązane przykłady. Jeśli rozumiesz, jak działają, będziesz mógł bez problemu wykonać zadanie.

Komentarze

  • Witam jeszcze raz, myślę, że ' m blisko zdobycia, ale jedno krótkie pytanie jest i tak jak zresetować serial.available (); wartość i przywrócenie jej z powrotem do 0?
  • Możesz wykonać Serial.read() bez używania zwróconej wartości, dopóki Serial.available() zwróci 0.

Odpowiedź

Zakładając, że szkic powinien wypisać „Hello World”, gdy znak wejściowy ma 3 bity wysokości. Oto kilka różnych wariantów zliczania liczby bitów ustawionych w bajcie.

int bits1(int c) { int res = 0; for (int i = 0; i < 8; i++) { if ((1 << i) & c) res = res + 1; } return (res); } int bits2(int c) { int m = 0x80; int res = 0; do { if (m & c) res++; } while (m >>= 1); return (res); } int bits3(int c) { int m = 0x80; int res = 0; do { res += (m & c) != 0; } while (m >>= 1); return (res); } #define bits4(c) __builtin_popcount(c) #define bits bits4 void setup() { Serial.begin(9600); while (!Serial); } void loop() { if (Serial.available() > 0) { int c = Serial.read(); if (bits(c) == 3) { Serial.print((char) c); Serial.print(":"); Serial.print(c, BIN); Serial.println(": Hello World"); } } } 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *