Arduino Hello World v sériovém monitoru

Ahoj, byli jsme požádáni, abychom naprogramovali něco, co když zadám něco do sériového monitoru, vytiskne Hello world, ale háček je pouze tiskne ahoj svět za podmínek, že váš vstup v sériovém monitoru je 3 bitový vstup a poté potřebuji mít kód, který jej potom zastaví v opakovaném tisku. můj jediný problém je, že nevím, jak spočítat počet bitů vstupu a také zastavit nepřetržitý tisk.

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

Komentáře

  • Je to úkol školní třídy?
  • Přidejte prosím svůj kód.
  • Ano, je. A je to také úkol před vlastní lekcí
  • Co přesně myslíte 3bitovým vstupem? Sériové rozhraní odesílá pouze celé bajty. Jde o konkrétní hodnoty ve 3 z 8 bitů jednoho bajtu?
  • zde se říká, že 3 znaky připravené ke čtení (bajty) jsou 3 bity? nebo jsem špatně předpoklad?

odpověď

Soudě podle komentářů zaostáváte za některými základními znalostmi. Chcete-li se opravdu naučit, co se v tomto úkolu máte naučit, měli byste si prohlédnout svůj učební materiál nebo výukové programy C / C ++ a Arduino na webu . Zde vám poskytnu pouze několik rad s uvažováním, které vám mohou pomoci při řešení úkolu. (Unfortu v současné době není zcela jasné, co přesně je úkolem)

  • Rozhraní Serial Arduina (rozhraní UART) odesílá data do bajty, jeden po druhém a jeden po druhém (odtud název serial). 1 bajt je řada 8 bitů, z nichž každý má hodnotu 1 nebo 0. 8 bitů dohromady tvoří hodnotu, kterou lze také vyjádřit jako desetinnou hodnotu od 0 do 255. Například je binární ekvivalent desetinného čísla 75. (Pro další vysvětlení google na systém binárních čísel) Bajtová data lze také vyjádřit jako znaky, protože jsou definována ve standardu ASCII. Každá binární hodnota odkazuje na konkrétní znak. To se děje na sériovém monitoru Arduino IDE. (Další vysvětlení google ASCII)
  • Jelikož se data odesílají sériově, mohou se v přenosu objevit určitá zpoždění, která jsou člověkem nepozorovatelná, ale Arduino je dostatečně rychlé, takže Serial.available() příkaz může vrátit 0, protože v tom okamžiku došlo k malému zpoždění přenosu. Proto je důležité zachytit celou zprávu, než se s ní pokusíte pracovat. To lze provést buď počítáním bajtů (čekáním, dokud nejsou ve vyrovnávací paměti k dispozici alespoň 3 bajty), nebo označením konce zprávy zvláštním znakem (například znakem nového řádku „\ n“). Na webu je spousta návodů, jak udělat obojí. Můžete začít s blogem Majenko .
  • Můžete získat počet přijatých bajtů s návratovou hodnotou Serial.available(). Vrátí 3, když jsou ve vyrovnávací paměti 3 připraveny ke čtení bajtů.
  • Pokud definujete proměnnou uvnitř void loop(), bude po ukončení funkce zahozeno a předefinováno, jakmile bude funkce spuštěna znovu (ve světě Arduino je funkce void loop() volána znovu a znovu navždy) . Ztratíte veškerý obsah, který byl zapsán do této proměnné. Pokud chcete přetrvávat data nad prováděním funkce void loop(), můžete proměnnou definovat mimo libovolnou funkci na horní část programu. Tato proměnná je poté globální a bude definována pouze jednou na začátku programu a bude platit po celou dobu životnosti programu.
  • Jak bylo napsáno v komentáři, neměli byste vrátit hodnotu z funkce void, s ince void většinou znamená, že neexistuje žádná návratová hodnota. A návrat z funkce void loop() tuto funkci pouze restartuje (protože jsme ve světě Arduino).
  • Můžete vypustit delay(2). Není to nutné. A pokud to funguje jen se zpožděním, pak něco jiného není správné a vy pouze pracujete s příznaky místo skutečného problému.

Také byste se neměli snažit stavět vše na svém vlastnit a znovu objevit kolo. Místo toho se pokuste podívat na příklady, které přicházejí s Arduino IDE. Například SerialEvent příklad, který ukazuje, jak přijímat sériovou zprávu (která je ukončena znakem nového řádku „\ n“). Podívejte se také na další související příklady. Pokud pochopíte, jak fungují, budete moci úkol bez problémů provést.

Komentáře

  • Ahoj znovu, myslím, že ' m blízko k získání, ale jedna rychlá otázka je tam stejně resetování serial.available (); hodnotu a vrátit ji zpět na 0?
  • Serial.read() můžete použít bez použití vrácené hodnoty, dokud Serial.available() nevrátí 0.

Odpověď

Za předpokladu, že by skica měla tisknout „Hello World“, pokud má vstupní znak 3 bity. Zde je několik různých variant počítání počtu bitů nastavených v bajtu.

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *