Arduino Hello World i seriell skjerm

Hei, vi ble bedt om å programmere noe som når jeg skriver inn noe i seriell skjerm det skriver ut Hello world men fangsten er det bare skriver ut hei verden under betingelsene at inngangen din i den serielle skjermen er en 3-biters inngang, og etter det må jeg ha en kode som deretter hindrer den i å skrive ut igjen og igjen. mitt eneste problem er at jeg ikke vet hvordan jeg skal telle antall biter i en inngang og også å stoppe den fra å skrive ut kontinuerlig.

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

  • Er dette en skoleklasseoppgave?
  • Vennligst legg til koden.
  • Ja, den er det. Og det er også en oppgave før selve leksjonen
  • Hva mener du egentlig med 3-biters inngang? Det serielle grensesnittet sender bare hele byte. handler dette om spesifikke verdier i 3 av de 8 bitene av en enkelt byte?
  • det står her at 3 klar til å bli lest karakter (byte) er at 3 bits? eller er min antagelse feil?

Svar

Å dømme ut fra kommentarene, legger du litt grunnleggende kunnskap. For å virkelig lære det du skal lære i denne oppgaven, bør du gå gjennom læringsmaterialet ditt eller C / C ++ og Arduino Tutorials på nettet Her vil jeg bare gi deg noen hint med resonnement som kan hjelpe deg med å løse oppgavens oppgave. (Unfortu nately er det ikke helt klart, hva nøyaktig oppgaven er her)

  • Serial grensesnittet til Arduino (et UART-grensesnitt) sender dataene inn byte, ett om gangen og det ene etter det andre (derav navnet serial). 1 byte er en serie på 8 bits, hver av dem med en verdi på 1 eller 0. Til sammen danner de 8 bitene en verdi som også kan uttrykkes som en desimalverdi fra 0 til 255. For eksempel 01001011 er det binære ekvivalenten til desimaltallet 75. (For ytterligere forklaringer google det binære tallsystemet) Byte-dataene kan også uttrykkes som tegn, slik de er definert i ASCII-standarden. Hver binær verdi refererer til et bestemt tegn. Dette er hva som skjer i den serielle skjermen til Arduino IDE. (For flere forklaringer google ASCII)
  • Siden dataene sendes serielt, kan det forekomme noen forsinkelser i overføringen, som ikke blir lagt merke til av mennesker, men Arduino er rask nok, slik at Serial.available() -kommandoen kan returnere 0, fordi det i det øyeblikket skjedde en liten forsinkelse i overføringen. Derfor er det viktig å fange hele meldingen før du prøver å jobbe med den. Du kan gjøre dette ved å enten telle byte (vente til minst 3 byte er tilgjengelige i bufferen) eller ved å markere slutten av meldingen med et spesialtegn (for eksempel den nye linjetegnet «\ n»). Det er mange opplæringsprogrammer på nettet hvordan du gjør begge deler. Du kan starte med Majenko «blogg .
  • Du kan få antall byte som ble mottatt, med returverdien Serial.available(). Den returnerer 3 når det er 3 klar til å leses byte i bufferen.
  • Hvis du definerer en variabel inne i void loop(), den vil bli kastet når funksjonen avsluttes og omdefineres, når funksjonen starter igjen (I Arduino-verden kalles void loop() -funksjonen igjen og igjen for alltid) Du mister alt innholdet som ble skrevet til denne variabelen. Hvis du vil vedvare data over kjøringen av void loop() -funksjonen, kan du definere variabelen utenfor hvilken som helst funksjon på toppen av programmet. Denne variabelen er da global og vil bare bli definert en gang ved starten av programmet og holdes i hele programmets levetid.
  • Som det ble skrevet i kommentaren, bør du ikke returnere en verdi fra en void -funksjon, s ince void betyr for det meste at det ikke er noen returverdi. Og å returnere fra void loop() -funksjonen vil bare starte denne funksjonen på nytt (siden vi er i Arduino-verdenen).
  • Du kan grøfte delay(2). Det er ikke behov for det. Og hvis det bare fungerer med forsinkelsen, er ikke noe annet riktig, og du jobber bare med symptomene i stedet for det virkelige problemet.

Du bør heller ikke prøve å bygge alt på eier og gjenoppfinner hjulet. Prøv i stedet å se på eksemplene som følger med Arduino IDE. For eksempel SerialEvent eksempel, som viser hvordan du mottar en seriell melding (som avsluttes med et nytt linjetegn «\ n»). Ta også en titt på de andre relaterte eksemplene. Hvis du forstår hvordan de fungerer, vil du kunne utføre oppgaven uten problemer.

Kommentarer

  • Hei igjen, jeg tror jeg ' er nær å få det, men et raskt spørsmål er det uansett om å tilbakestille serien.tilgjengelig (); verdi og tilbakestille den tilbake til 0?
  • Du kan gjøre Serial.read() uten å bruke den returnerte verdien, til Serial.available() returnerer 0.

Svar

Forutsatt at skissen skal skrive ut «Hello World» når inngangstegnet har 3 bits høyt. Her er noen forskjellige varianter for å telle antall bits satt 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"); } } } 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *