Sou muito novo na programação do Arduino. Estou tentando identificar a string de entrada do monitor serial e imprimir a saída no console de acordo
O código é:
void setup() { Serial.begin(9600); } void loop() { while (Serial.available() > 0 ) { String str = Serial.readString(); if (str.equals("send")) { Serial.println("identified"); } else { Serial.println("unknown"); } } }
Sempre que eu colocar a string de envio está mostrando “desconhecido” como a saída, o que está errado, e devo ser “identificado” como a saída. Alguém pode me orientar aqui para alcançar o resultado.
Nota: Estou obtendo a saída como queria usando a função readStringUntil, mas as strings têm muitos “.” nele, portanto, não é útil.
Comentários
Resposta
Se você definir a linha do seu monitor serial terminando em “Both NL & CR”, então este código encontrará a palavra “send”. NÃO encontrará a palavra “send” nesta string, “ssend” ou nesta string, “sendd”.
void setup(){ Serial.begin(9600); } void loop(){ while(Serial.available() > 0 ){ String str = Serial.readString(); if(str.substring(0) == "send\r\n"){ Serial.println("identified");} else{ Serial.println("unknown"); } } }
Se você deseja encontrar a string “send” em “1234send” ou “send1234” ou “1234send5678” então use indexOf ();
void setup(){ Serial.begin(9600); } void loop(){ while(Serial.available() > 0 ){ String str = Serial.readString(); if(str.indexOf("send") > -1){ Serial.println("identified");} else{ Serial.println("unknown"); } } }
Resposta
Existem qualquer número de razões pelas quais o teste * .equals é falso. Considere a diferença entre maiúsculas e minúsculas ou caracteres extras introduzidos na fonte de suas comunicações. Mesmo caracteres não imprimíveis podem representar um problema e fazer com que o teste falhe. * .substring () em vez disso. Este método retornará verdadeiro se a substring for encontrada. Por exemplo:
String stringOne = "12345 send 1234"; // substring(index) looks for the substring from the index position to the end: if (stringOne.substring(0) == "send") { Serial.println("identified"); } else { Serial.println("unknown"); }
… deve sempre retorna “identificado” porque os caracteres “s”, “e”, “n” e “d” são encontrados na seqüência correta dentro da string stringOne.
Comentários
- String str = Serial.readString (); if (str.substring (0) == " send ") Serial.println (" identificado "); else Serial.println (" desconhecido "); isso não funcionou mesmo.
- Estranho. Você olhou o link para a página da web para ter certeza de que estava usando a substring corretamente? ( Esta página da web? ). Além disso, vejo pelos comentários que você imprimiu a string recebida e viu " send " na mensagem recebida, correto? Você pode apenas comentar a linha de leitura serial e tentar usar " String str = " 12345 send 1234 "; " para testar se tudo está funcionando. Julgando por outros comentários, você pode tentar enviar rapidamente (digitando) " space " + " enviar " + " espaço " (" envie ") para ver se funciona.
- Isso não ' t funcionará. substring (n) apenas retorna a parte da string começando na posição n. Portanto, substring (0) retorna apenas uma cópia da string. str.substring (0,4) retornará os primeiros 4 caracteres da string (assumindo que pelo menos 4 caracteres retornarão – eu ' não estou familiarizado o suficiente com esta implementação para saber o que serve para uma string mais curta – C # lançaria uma exceção).
Resposta
void setup() { Serial.begin(9600); } void loop() { char inChar[5]; if(Serial.available() > 0 ) { for (int i=0; i<5; i++) { inChar[i] = Serial.read(); delay(10); } if (inChar[0] == "s" && inChar[1] == "e" \ && inChar[2] == "n" \ && inChar[3] == "d") { Serial.println("identified"); } else { Serial.println("unknown"); } } }
Comentários
- Lendo a string " send " usar o comando Serial.readString () está certo. Mas, de alguma forma, ele não funcionará se você usar o resultado para comparação (por exemplo, data == " send " …). Uma solução possível é usar a matriz de caracteres (por exemplo, inChar [5]). O tamanho da matriz é 1 a mais do que o máximo de caracteres necessários.
\r\n
não/r/n
…