Hei, meitä pyydettiin ohjelmoimaan jotain, joka kirjoittaessani jotain sarjavalvontaan tulostaa Hello world, mutta saalis on se vain tulostaa heilumaailman sillä ehdolla, että syötteesi sarjamonitorissa on 3-bittinen tulo, ja sen jälkeen minulla on oltava koodi, joka sitten estää sitä tulostamasta uudestaan ja uudestaan. Ainoa ongelmani on, että en todellakaan osaa laskea syötteen bittien määrää ja estää myös jatkuvan tulostuksen.
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"); }
Kommentit
- Onko tämä koululuokan tehtävä?
- Lisää koodi.
- Kyllä se on. Ja se on myös tehtävä ennen varsinaista oppituntia
- Mitä tarkalleen ottaen tarkoitat 3-bittisellä syötöllä? Sarjaliitäntä lähettää vain kokonaisia tavuja. Tarkoittaako tämä tiettyjä arvoja kolmessa yhden tavun 8 bitistä?
- siinä sanotaan, että 3 luettavaksi luettavaa merkkiä (tavua) on se 3 bittiä vai olenko olettamukseni väärä?
Vastaa
Kommenttien perusteella voit viivyttää joitain perustietoja. Jos haluat todella oppia, mitä sinun pitäisi oppia tässä tehtävässä, sinun tulee tarkistaa oppimateriaalisi tai C / C ++ ja Arduino -oppaat verkossa Tässä annan sinulle vain joitain vihjeitä perusteluineen, jotka voivat auttaa sinua ratkaisemaan tehtäviä. (Unfortu ei todellakaan ole selvää, mikä tehtävä tässä oikein on.
- Arduinon (UART-käyttöliittymä)
Serial
-liitäntä lähettää tiedot tavua, yksi kerrallaan ja peräkkäin (tästä nimiserial
). 1 tavu on sarja 8 bittiä, joista jokaisen arvo on 1 tai 0. Yhdeksän 8 bittiä muodostavat arvon, joka voidaan ilmaista myös desimaaliarvona välillä 0 – 255. Esimerkiksi01001011
on desimaaliluvun 75 binaariekvivalentti. (Lisäselvityksiä varten google binaariluvujärjestelmä) Tavutiedot voidaan myös ilmaista merkkeinä, kuten ne on määritelty ASCII-standardissa. Jokainen binääriarvo viittaa tiettyyn merkkiin. Näin tapahtuu Arduino IDE -sarjan näytössä. (Lisää selityksiä google ASCII) - Koska tiedot lähetetään sarjana, siirrossa saattaa esiintyä viivästyksiä, joita ihmiset eivät huomaa, mutta Arduino on riittävän nopea, jotta
Serial.available()
-komento voi palauttaa arvon 0, koska sillä hetkellä tapahtui pieni viive lähetyksessä. Siksi on tärkeää saada kiinni koko viesti, ennen kuin yrität työskennellä sen kanssa. Voit tehdä tämän joko laskemalla tavuja (odottaa, kunnes vähintään 3 tavua on käytettävissä puskurissa) tai merkitsemällä viestin loppu erikoismerkillä (esimerkiksi uuden rivin merkki ”\ n”). Verkossa on paljon opetusohjelmia molempien tekemiseksi. Voit aloittaa Majenkon blogilla . - Voit saada vastaanotettujen tavujen määrän palautusarvolla
Serial.available()
. Se palauttaa 3, kun puskurissa on 3 valmiita luettavia tavuja. - Jos määrität muuttujan , se heitetään pois, kun funktio loppuu, ja määritellään uudelleen, kun toiminto käynnistyy uudelleen (Arduino-maailmassa toimintoa
void loop()
kutsutaan uudestaan ja uudestaan ikuisesti) . Menettää kaiken tähän muuttujaan kirjoitetun sisällön. Jos haluat säilyttää tietojavoid loop()
-toiminnon suorituksissa, voit määrittää muuttujan minkä tahansa funktion ulkopuolelle Tämä muuttuja on tällöin globaali ja määritetään vain kerran ohjelman alkaessa ja se pidetään voimassa ohjelman koko elinkaaren ajan. - Kuten kommentissa kirjoitettiin, arvoa ei pidä palauttaa funktiosta
void
, s incevoid
tarkoittaa enimmäkseen, että paluuarvoa ei ole. Ja palatessasivoid loop()
-toiminnosta tämä toiminto käynnistetään vain uudelleen (koska olemme Arduino-maailmassa). - Voit poistaa
delay(2)
. Sitä ei tarvita. Ja jos se toimii vain viiveellä, jokin muu ei ole oikein ja työskentelet vain oireiden kanssa todellisen ongelman kanssa.
Sinun ei myöskään pitäisi yrittää rakentaa kaikkea omaan omistaa ja keksi pyörä uudelleen. Sen sijaan yritä tarkastella esimerkkejä, jotka tulevat Arduino IDE: n mukana. Esimerkiksi SerialEvent
-esimerkki, joka näyttää, kuinka sarjaviesti vastaanotetaan (jonka päättää uuden rivin merkki ”\ n”). Katso myös muita asiaan liittyviä esimerkkejä. Jos ymmärrät heidän toimintansa, voit tehdä tehtävän ilman mitään ongelmia.
Kommentit
- Hei, luulen mielestäni ' m lähellä sen saamista, mutta yksi pikakysymys on silti olemassa serial.available (): n nollaamiseksi; arvo ja palautetaan se takaisin nollaksi?
- Voit tehdä
Serial.read()
käyttämättä palautettua arvoa, kunnesSerial.available()
palauttaa arvon 0.
Vastaus
Olettaen, että luonnoksen pitäisi tulostaa ”Hello World”, kun syötemerkissä on 3 bittiä korkea. Tässä on muutama erilainen muunnelma tavussa asetettujen bittien määrän laskemisesta.
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"); } } }