Arduino Hello World i seriell bildskärm

Hej vi ombads att programmera något som när jag matar in något i den seriella bildskärmen skriver det ut Hello world men fångsten är det bara skriver ut hej världen under de förhållanden att din inmatning i den seriella bildskärmen är en 3-bitars ingång och efter det måste jag ha en kod som sedan hindrar den från att skriva ut om och om igen. mitt enda problem är att jag inte riktigt vet hur man räknar antalet bitar i en inmatning och också förhindrar att den skrivs ut kontinuerligt.

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"); } 

Kommentarer

  • Är det här en skolklassuppgift?
  • Lägg till din kod.
  • Ja det är det och det är också en uppgift före själva lektionen
  • Vad menar du exakt med 3-bitarsinmatning? Det seriella gränssnittet skickar bara hela byte. Handlar det om specifika värden i 3 av de 8 bitarna i en enda byte?
  • det står här att 3 redo att läsas karaktär (byte) är att 3 bitar? eller är mitt antagande fel?

Svar

Att döma av kommentarerna fördröjer du lite grundläggande kunskaper. För att verkligen lära dig vad du ska lära dig i denna uppgift bör du granska ditt inlärningsmaterial eller C / C ++ och Arduino Tutorials på webben Här kommer jag bara att ge dig några tips med resonemang som kan hjälpa dig att lösa uppgiften. (Unfortu naturligt är det inte riktigt klart, vad exakt uppgiften är här)

  • Serial gränssnittet för Arduino (ett UART-gränssnitt) skickar in data byte, en i taget och en efter en (därav namnet serial). 1 byte är en serie på 8 bitar, var och en med ett värde på 1 eller 0. Tillsammans bildar de 8 bitarna ett värde som också kan uttryckas som ett decimalvärde från 0 till 255. Till exempel 01001011 är den binära ekvivalenten till decimaltal 75. (För ytterligare förklaringar google det binära talsystemet) Byte-data kan också uttryckas som tecken, såsom de definieras i ASCII-standarden. Varje binärt värde avser ett specifikt tecken. Detta är vad som händer i den seriella bildskärmen på Arduino IDE. (För mer förklaringar google ASCII)
  • Eftersom data skickas seriellt kan det förekomma vissa förseningar i överföringen, som är omärkliga av människor, men Arduino är tillräckligt snabb, så att Serial.available() -kommandot kan returnera 0, för vid det tillfället inträffade en liten fördröjning i överföringen. Därför är det viktigt att fånga hela meddelandet innan du försöker arbeta med det. Du kan göra detta genom att antingen räkna byte (vänta tills minst 3 byte är tillgängliga i bufferten) eller genom att markera slutet på meddelandet med ett specialtecken (till exempel nylinjetecknet ”\ n”). Det finns många handledning på nätet hur man gör båda. Du kan börja med Majenkos blogg .
  • Du kan få antalet byte som mottogs med returvärdet Serial.available(). Det returnerar 3 när det finns 3 redo att läsas byte i bufferten.
  • Om du definierar en variabel inuti void loop(), den kommer att slängas när funktionen slutar och omdefinieras, när funktionen startar om igen (I Arduino-världen kallas void loop() -funktionen om och om igen för alltid) Du kommer att förlora allt innehåll som har skrivits till den här variabeln. Om du vill bestå data över körningarna av void loop() -funktionen kan du definiera variabeln utanför vilken funktion som helst toppen av ditt program. Denna variabel är då global och kommer att definieras endast en gång i början av programmet och hålls under hela programmets livstid.
  • Som skrivet i kommentaren ska du inte returnera ett värde från en void -funktion, s ince void betyder mestadels att det inte finns något returvärde. Och att återvända från void loop() -funktionen startar bara om den här funktionen (eftersom vi är i Arduino-världen).
  • Du kan dike delay(2). Det finns inget behov av det. Och om det bara fungerar med förseningen, så är något annat inte korrekt och du arbetar bara med symtomen istället för det verkliga problemet.

Du bör inte heller försöka bygga allt på din äga och återuppfinna hjulet. Försök istället att titta på exemplen som följer med Arduino IDE. Till exempel exemplet SerialEvent, som visar hur man tar emot ett seriemeddelande (som avslutas med en nylinjetecken ”\ n”). Ta också en titt på de andra relaterade exemplen. Om du förstår hur de fungerar kommer du att kunna göra uppgiften utan problem.

Kommentarer

  • Hej igen, jag tror att jag ' Jag är nära att få det men en snabb fråga är det ändå att återställa serien.available (); värde och återställa det till 0?
  • Du kan göra Serial.read() utan att använda det returnerade värdet tills Serial.available() returnerar 0.

Svar

Antar att skissen ska skriva ut ”Hello World” när ingångstecknet har tre bitar höga. Här är några olika varianter för att räkna antalet bitar i en byte.

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"); } } } 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *