Arduino serial.read to int

2

Estoy intentando leer una cadena serial que aparece como "R0123", por ejemplo, entonces necesito que el 0123 esté en un int. para enviar a través de otro método

Aquí está mi código, no funciona de la manera que creo que debería

void loop()
{
  if(Serial.available())
  {
    delay(100);
    if(Serial.read() == 'R')
      {
        int r1 = Serial.read();
        int r2 = Serial.read();
        int r3 = Serial.read();
        int r4 = Serial.read();
        int red = ((int)r1 * 1000) + ((int)r2 * 100) + ((int)r3 * 10) + (int)r4;

        sb.sendColour(red,0,0);

        Serial.print(r1,0);
        Serial.print(r2,0);
        Serial.print(r3,0);
        Serial.print(r4,0);
        Serial.print(red);
      }
  }
}

'

    
pregunta Ashley Hughes

6 respuestas

7

¿Qué hay de usar atoi ()? Aún deberá recortar la 'R', y es posible que tenga que rellenarla con un carácter NULO al final ('\ 0'). Pero entonces debería funcionar como:

int rInteger = atoi(s);

cuando s es un puntero a una cadena terminada en nulo.

    
respondido por el Bladt
8

Confunde valores enteros y valores de caracteres ascii. Cuando tu

  int r1 = Serial.read();

lee un 0, leerá el carácter ASCII 0. El valor entero del carácter 0 es (decimal) 48 (verifique, por ejemplo, esta tabla ascii ). Así que en lugar de eso, la línea debería leer

  int r1 = Serial.read() - 48;

o incluso mejor

  int r1 = Serial.read() - '0';
    
respondido por el Wouter van Ooijen
5

Esto lee 4 caracteres después de la "R", los coloca en una matriz char y agrega un carácter null . Luego se convierte a entero. El código no comprueba si hay al menos 4 caracteres después de la "R", o si son dígitos, sin embargo.

#define numberOfDigits 4
char theNumberString[numberOfDigits + 1];
int theNumber;

if(Serial.read() == 'R')
  {
  for (int i = 0; i < numberOfDigits; theNumberString[i++] = Serial.Read());
  theNumberString[numberOfDigits] = 0x00;
  theNumber = atoi(theNumberString);
}
    
respondido por el stevenvh
1

Puedes probar:

int intParse(byte length) //return parsed byte from serial
{    
  char BUFFER[length + 1];
  delay(5); //need for Baud 9600, less delay for faster speed
  for(byte i = 0; i < length; i++)    
    BUFFER[i] = Serial.read();   
  BUFFER[length] = 0; //I had this earlier, but not necessary for Arduino.
  return atoi(BUFFER);
}

Por ejemplo: R1234 Usted escribiría:

void loop()
{
  char input = Serial.read();
  if(input == 'R')
  {
    int output = intParse(4);
  }
}
    
respondido por el NothinRandom
0

código más simple usando parseInt()

void loop()
{ 
  if (Serial.available())
  {
   int f = Serial.parseInt();  
   if (f > 0)
   {
     Serial.println(f);
   } 
  } 
}
    
respondido por el ano
-1

¿Por qué no usar la función "readString ()"? Entonces puedes tener tu código como:

void setup() {
  Serial.begin(9600);
  Serial.println("Waiting for intstructions...\n");
}

void loop() {
  if(Serial.available()) {
  Serial.println(Serial.readString());
  }
}
    
respondido por el Ritvik Mandyam

Lea otras preguntas en las etiquetas

Comentarios Recientes

/ byte de datos enviados en serie con el operador. Si la dirección de Arduino se devuelve a través de try, la variable int se establece en el valor de la variable int / byte enviada por Arduino. mapeos de entrada y 26kBK 4 × 4B0 de entrada. Esto permite la depuración de nivel, la recuperación, etc. También se controla un cierto límite de velocidad para la altura del campo del cable, los controladores conectados, ya sea la resistencia o la inductancia, están bien. Sin embargo, se deben cargar controladores adicionales... Lees verder