Ciao ci è stato chiesto di programmare qualcosa che quando inserisco qualcosa nel monitor seriale stampa Hello world ma il trucco è solo stampa ciao mondo a condizione che il tuo input nel monitor seriale sia un input a 3 bit e dopo di che ho bisogno di avere un codice che quindi interrompe la stampa più e più volte. il mio unico problema è che non so davvero come contare il numero di bit di un input e come impedire che venga stampato continuamente.
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"); }
Commenti
- È un compito di classe scolastica?
- Aggiungi il tuo codice.
- Sì, lo è. Ed è anche un compito prima della lezione vera e propria
- Cosa si intende esattamente per input a 3 bit? Linterfaccia seriale invia solo byte interi. Si tratta di valori specifici in 3 degli 8 bit di un singolo byte?
- qui si dice che 3 caratteri (byte) pronti per essere letti sono 3 bit? o la mia ipotesi è sbagliata?
Risposta
A giudicare dai commenti, alcune conoscenze di base sono in ritardo. Per imparare veramente cosa dovresti imparare in questo compito, dovresti rivedere il tuo materiale didattico o i tutorial C / C ++ e Arduino sul web . Qui ti darò solo alcuni suggerimenti con il ragionamento, che possono aiutarti a risolvere il compito degli incarichi. (Unfortu naturalmente non è proprio chiaro quale sia esattamente il compito qui)
- Linterfaccia
Serial
di Arduino (uninterfaccia UART) invia i dati in byte, uno alla volta e uno dopo laltro (da cui il nomeserial
). 1 byte è una serie di 8 bit, ciascuno con valore 1 o 0. Insieme gli 8 bit formano un valore, che può essere espresso anche come valore decimale compreso tra 0 e 255. Ad esempio01001011
è lequivalente binario del numero decimale 75. (Per ulteriori spiegazioni google the binary number system) I dati in byte possono essere espressi anche come caratteri, in quanto definiti nello standard ASCII. Ogni valore binario si riferisce a un carattere specifico. Questo è ciò che accade nel monitor seriale dellIDE di Arduino. (Per maggiori spiegazioni google ASCII) - Poiché i dati vengono inviati in serie, potrebbero verificarsi dei ritardi nella trasmissione, che sono impercettibili dalluomo, ma Arduino è abbastanza veloce, in modo che il
Serial.available()
potrebbe restituire 0, perché in quel momento si è verificato un piccolo ritardo nella trasmissione. Quindi è importante cogliere lintero messaggio, prima di provare a lavorarci. Puoi farlo contando i byte (aspettando che siano disponibili almeno 3 byte nel buffer) o contrassegnando la fine del messaggio con un carattere speciale (ad esempio il carattere di nuova riga “\ n”). Ci sono molti tutorial sul web su come fare entrambe le cose. Puoi iniziare con il blog di Majenko . - Puoi ottenere il numero di byte ricevuti con il valore di ritorno
Serial.available()
. Restituirà 3, quando ci sono 3 byte pronti per essere letti nel buffer. - Se definisci una variabile allinterno del
void loop()
, verrà buttato via quando la funzione finisce e ridefinito, quando la funzione ricomincia (Nel mondo Arduino la funzionevoid loop()
viene chiamata ancora e ancora per sempre) . Perderai tutto il contenuto scritto in questa variabile. Se desideri rendere persistenti i dati durante le esecuzioni della funzionevoid loop()
, puoi definire la variabile al di fuori di qualsiasi funzione nella allinizio del programma. Questa variabile è quindi globale e verrà definita solo una volta allinizio del programma e sarà mantenuta per tutta la durata del programma. - Come scritto nel commento non dovresti restituire un valore da una funzione
void
, s incevoid
per lo più significa che non è presente alcun valore di ritorno. E il ritorno dalla funzionevoid loop()
riavvierà solo questa funzione (dato che siamo nel mondo di Arduino). - Puoi abbandonare il
delay(2)
. Non ce nè bisogno. E se funziona solo con il ritardo, allora qualcosaltro non è corretto e stai solo lavorando con i sintomi invece con il vero problema.
Inoltre non dovresti provare a costruire tutto sul tuo possedere e reinventare la ruota. Prova invece a guardare gli esempi forniti con lIDE di Arduino. Ad esempio lesempio SerialEvent
, che mostra come ricevere un messaggio seriale (che termina con un carattere di nuova riga “\ n”). Dai unocchiata anche agli altri esempi correlati. Se capisci come funzionano, sarai in grado di svolgere il compito senza problemi.
Commenti
- Ciao di nuovo, penso di ' sto quasi per ottenerlo, ma una domanda veloce è comunque quella di resettare serial.available (); valore e riportarlo a 0?
- Puoi eseguire
Serial.read()
senza utilizzare il valore restituito, finchéSerial.available()
restituisce 0.
Risposta
Supponendo che lo schizzo debba stampare “Hello World” quando il carattere di input ha 3 bit di altezza. Di seguito sono riportate alcune diverse varianti del conteggio del numero di bit impostato in un 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"); } } }