Hej vi blev bedt om at programmere noget, som når jeg indtaster noget i den serielle skærm, det udskriver Hello world, men fangsten er det kun udskriver hej verden under de betingelser, at dit input i den serielle skærm er et 3-bit input, og derefter skal jeg have en kode, som derefter forhindrer det i at udskrive igen og igen. mit eneste problem er, at jeg ikke rigtig ved, hvordan man tæller antallet af bits på et input og også forhindrer det i at udskrive 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
- Er dette en skoleklasseopgave?
- Tilføj venligst din kode.
- Ja, det er det, og det er også en opgave før den aktuelle lektion
- Hvad mener du præcist med 3-bit input? Den serielle grænseflade sender kun hele byte. handler det om specifikke værdier i 3 af de 8 bits i en enkelt byte?
- det står her, at 3 klar til at blive læst karakter (bytes) er, at 3 bits? eller er min antagelse forkert?
Svar
At dømme ud fra kommentarerne lægger du lidt grundlæggende viden. For virkelig at lære, hvad du skal lære i denne opgave, skal du gennemgå dit læringsmateriale eller C / C ++ og Arduino Tutorials på nettet Her vil jeg kun give dig nogle tip med ræsonnement, der kan hjælpe dig med at løse opgavens opgave. (Uheldig nately er det ikke rigtig klart, hvad opgaven er her)
-
Serial
-grænsefladen til Arduino (en UART-grænseflade) sender dataene ind bytes, en ad gangen og en efter en (deraf navnetserial
). 1 byte er en serie på 8 bits, hver af dem med en værdi på 1 eller 0. Tilsammen udgør de 8 bits en værdi, der også kan udtrykkes som en decimalværdi fra 0 til 255. For eksempel01001011
er det binære ækvivalent med decimaltallet 75. (For yderligere forklaringer google det binære nummersystem) Bytedataene kan også udtrykkes som tegn, som de er defineret i ASCII-standarden. Hver binær værdi henviser til et bestemt tegn. Dette er hvad der sker i den serielle skærm på Arduino IDE. (For flere forklaringer google ASCII) - Da dataene sendes serielt, kan der forekomme nogle forsinkelser i transmissionen, som ikke kan ses af mennesker, men Arduino er hurtig nok, så
Serial.available()
returnerer muligvis 0, fordi der i det øjeblik opstod en lille forsinkelse i transmissionen. Derfor er det vigtigt at fange hele meddelelsen, inden du prøver at arbejde med den. Du kan gøre dette ved enten at tælle byte (vente på, at mindst 3 byte er tilgængelige i bufferen) eller ved at markere slutningen af meddelelsen med et specialtegn (for eksempel den nye linjetegn “\ n”). Der er mange tutorials på internettet, hvordan man gør begge dele. Du kan starte med Majenkos blog . - Du kan få det antal bytes, der blev modtaget, med returværdien
Serial.available()
. Det returnerer 3, når der er 3 byte klar til at blive læst i bufferen. - Hvis du definerer en variabel inde i
void loop()
, det vil blive kastet, når funktionen slutter og defineres igen, når funktionen starter igen (I Arduino-verdenen kaldesvoid loop()
-funktionen igen og igen for evigt) . Du mister alt indhold, der blev skrevet til denne variabel. Hvis du vil vedvare data over eksekveringerne afvoid loop()
-funktionen, kan du definere variablen uden for enhver funktion på toppen af dit program. Denne variabel er derefter global og defineres kun en gang ved programmets start og holdes i hele programmets levetid. - Som skrevet i kommentaren skal du ikke returnere en værdi fra en
void
-funktion, s incevoid
betyder for det meste, at der ikke er nogen returværdi. Og at vende tilbage fravoid loop()
-funktionen genstarter kun denne funktion (da vi er i Arduino-verdenen). - Du kan grøfte
delay(2)
. Der er ikke behov for det. Og hvis det kun virker med forsinkelsen, så er noget andet ikke korrekt, og du arbejder bare med symptomerne i stedet for det virkelige problem.
Du bør heller ikke prøve at bygge alt på din ejer og genopfinder hjulet. Prøv i stedet at se på eksemplerne, der følger med Arduino IDE. Eksempelvis SerialEvent
eksemplet, der viser, hvordan man modtager en seriel besked (som afsluttes med et nyt linjetegn “\ n”). Se også på de andre relaterede eksempler. Hvis du forstår, hvordan de fungerer, vil du være i stand til at udføre opgaven uden problemer.
Kommentarer
- Hej igen, jeg tror jeg ' m tæt på at få det, men et hurtigt spørgsmål er der alligevel at nulstille serial.available (); værdi og vende tilbage til 0?
- Du kan gøre
Serial.read()
uden at bruge den returnerede værdi, indtilSerial.available()
returnerer 0.
Svar
Antages det, at skitsen skal udskrive “Hello World”, når inputtegnet har 3 bit højt. Her er et par forskellige varianter af optælling af antallet af bit, der er angivet 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"); } } }