es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Se llama “receiveEvent” solo una vez en el código de Arduino de ‘Wire Slave Receiver’?

Estoy intentando leer datos de un microcontrolador leyendo su interfaz i2c y conectándolo a mi Arduino ATMega2560. Si se reciben mensajes, se imprimen en el Serial (Arduino está en mi puerto COM de la PC).

Mi problema es que, aunque i2c está enviando datos en un bucle, solo se muestra el primer mensaje en mi interfaz serie (¡se recibe correctamente!), todos los mensajes futuros no son enviados desde el Arduino. También hice que el Arduino envíe mensajes en un bucle a mi archivo, eso funcionó. Así que supuse que debe haber algo con este receiveEvent() que se usa con ese propósito en el código de Arduino.

El código es del ejemplo ‘slave_receiver’ de Arduino, solo cambié la dirección.

“`// Wire Slave Receiver
// por Nicholas Zambetti <http: www.zambetti.com="">

// Demuestra el uso de la biblioteca Wire
// Recibe datos como un dispositivo esclavo I2C/TWI
// Consulta el ejemplo "Wire Master Writer" para su uso con esto

// Creado el 29 de marzo de 2006

// Este código de ejemplo está en el dominio público.

h1 incluye <wire.h> /h1

void setup() {
Wire.begin(0x04); // unirse al bus i2c con la dirección #4
Wire.onReceive(receiveEvent); // registrar evento
Serial.begin(115200); // iniciar serial para la salida
}

void loop() {
delay(1);
}

// función que se ejecuta cada vez que se recibe un dato del maestro
// esta función se registra como un evento, ver setup()
void receiveEvent(int howMany) {
while (1 < Wire.available()) { // bucle a través de todos excepto el último
char c = Wire.read(); // recibir byte como un carácter
Serial.print(c); // imprimir el carácter
}
}“`</wire.h>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Solución

    El problema está en la instrucción while (1 < Wire.available()) en la función receiveEvent. Esto recorrerá todos los datos disponibles recibidos del maestro, excepto el último byte de datos. Por lo tanto, si solo se envía un byte de datos desde el maestro, este bucle no se ejecutará y el siguiente mensaje no será recibido por el Arduino.

    Para solucionarlo, cambia la instrucción while por un bucle for que recorra todos los datos disponibles y reciba cada byte.

    c++
    void receiveEvent(int howMany) {
    for(int i = 0; i < howMany; i++) { // recorrer todos los datos disponibles
    char c = Wire.read(); // recibir byte como un carácter
    Serial.print(c); // imprimir el carácter
    }
    }

    Esto recibirá todos los datos disponibles enviados por el maestro e imprimirá en la interfaz serial.

Comments are closed.