Olá, fomos solicitados a programar algo que, quando eu inserir algo no monitor serial, ele exibirá Hello world, mas o problema é que só imprime hello world sob as condições de que sua entrada no monitor serial é uma entrada de 3 bits e, depois disso, eu preciso ter um código que interrompa a impressão repetidamente. meu único problema é que eu realmente não sei como contar o número de bits de uma entrada e também como impedir que ela imprima 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"); }
Comentários
- Este é um trabalho de classe escolar?
- Por favor, adicione seu código.
- Sim, é. E também é um trabalho antes da lição real
- O que exatamente você quer dizer com entrada de 3 bits? A interface serial envia apenas bytes inteiros. Trata-se de valores específicos em 3 dos 8 bits de um único byte?
- diz aqui que 3 caracteres prontos para serem lidos (bytes) são 3 bits? ou estou, minha suposição está errada?
Resposta
A julgar pelos comentários, você perdeu alguns conhecimentos básicos. Para realmente aprender, o que você deve aprender nesta tarefa, você deve revisar o seu material de aprendizagem ou os tutoriais C / C ++ e Arduino na web . Aqui vou apenas dar algumas dicas com raciocínio, que podem ajudá-lo a resolver a tarefa de atribuições. (Unfortu naturalmente, não está muito claro qual é exatamente a tarefa aqui)
- A
Serial
interface do Arduino (uma interface UART) envia os dados em bytes, um por vez e um após o outro (daí o nomeserial
). 1 byte é uma série de 8 bits, cada um deles com um valor de 1 ou 0. Juntos, os 8 bits formam um valor, que também pode ser expresso como um valor decimal de 0 a 255. Por exemplo01001011
é o equivalente binário do número decimal 75. (Para obter mais explicações, google o sistema numérico binário) Os dados de byte também podem ser expressos como caracteres, conforme são definidos no padrão ASCII. Cada valor binário se refere a um caractere específico. Isso é o que acontece no monitor serial do IDE do Arduino. (Para mais explicações google ASCII) - Como os dados são enviados em série, podem ocorrer alguns atrasos na transmissão, que são imperceptíveis para os humanos, mas o Arduino é rápido o suficiente, para que o
Serial.available()
pode retornar 0, pois naquele momento ocorreu um pequeno atraso na transmissão. Portanto, é importante captar toda a mensagem antes de tentar trabalhar com ela. Você pode fazer isso contando bytes (esperando até pelo menos 3 bytes estarem disponíveis no buffer) ou marcando o final da mensagem com um caractere especial (por exemplo, o caractere de nova linha “\ n”). Existem muitos tutoriais na web sobre como fazer as duas coisas. Você pode começar com o blog do Majenko . - Você pode obter o número de bytes que foram recebidos com o valor de retorno de
Serial.available()
. Ele retornará 3, quando houver 3 bytes prontos para serem lidos no buffer. - Se você definir uma variável dentro de
void loop()
, será descartado quando a função terminar e redefinida, quando a função começar novamente (no mundo do Arduino, a funçãovoid loop()
é chamada repetidamente para sempre) . Você perderá todo o conteúdo que foi gravado nesta variável. Se você deseja persistir os dados durante as execuções da funçãovoid loop()
, você pode definir a variável fora de qualquer função no topo do seu programa. Esta variável é então global e será definida apenas uma vez no início do programa e mantida por toda a vida do programa. - Conforme escrito no comentário, você não deve retornar um valor de uma função
void
, s incevoid
significa principalmente que não há valor de retorno. E retornar da funçãovoid loop()
apenas reiniciará esta função (já que estamos no mundo Arduino). - Você pode abandonar o
delay(2)
. Não há necessidade disso. E se funcionar apenas com o atraso, então algo não está correto e você está apenas trabalhando com os sintomas em vez do problema real.
Além disso, você não deve tentar construir tudo em seu possuir e reinventar a roda. Em vez disso, tente olhar os exemplos que vêm com o IDE do Arduino. Por exemplo, o SerialEvent
exemplo, que mostra como receber uma mensagem serial (que termina com um caractere de nova linha “\ n”). Também dê uma olhada em outros exemplos relacionados. Se você entender como eles funcionam, você conseguirá fazer a tarefa sem problemas.
Comentários
- Oi de novo, acho que ' m perto de obtê-lo, mas uma pergunta rápida existe de qualquer maneira sobre redefinir o serial.available (); valor e revertendo-o para 0?
- Você pode fazer
Serial.read()
sem usar o valor retornado, até queSerial.available()
retorne 0.
Resposta
Presumindo que o esboço deve imprimir “Hello World” quando o caractere de entrada tiver 3 bits de altura. Aqui estão algumas variantes diferentes de contagem do número de bits definidos em um 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"); } } }