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.

Error extraño en la comunicación i2c entre Arduino y Raspberry Pi 4B.

Tengo un error extraño cuando envío datos desde Arduino Mega a través de I2C a Raspberry Pi 4B.

Arduino Mega funciona como esclavo y Raspberry Pi como maestro. Raspberry Pi solicita datos a Arduino y éste envía una cadena de letras y números que se ven así (sin salto de línea al final):

xxE5xNx

pero Raspberry Pi recibe:

xxE5xN@

Seguramente no es un problema con la conexión, porque probé enviando y recibiendo 1000 paquetes sin ningún error.

Este error no ocurre cuando cambio ‘E’, ‘5’ o ‘N’ por otro carácter o elimino los dos primeros caracteres. Cuando cambio cualquier ‘x’ por otro carácter, el error todavía existe. ¿Por qué?

Código mínimo para reproducir:

Arduino Mega (esclavo):

#include <wire.h>

String s = “xxE5xNx”;
void i2cRequest(){
Wire.print(s);
}

void setup() {
Wire.begin(0x01);
Wire.onRequest(i2cRequest);
}

void loop() {}

Raspberry Pi 4B (maestro):

from smbus2 import SMBus

bus = SMBus(1)

data = bus.read_i2c_block_data(0x01, 0, 32)
text = “”
for m in data:
if(m != 255): text += chr(m)

print(text)</wire.h>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Según la información proporcionada, parece que el problema está relacionado con el código ASCII del carácter ‘@’, que es 64. El carácter ‘N’ tiene un código ASCII de 78 y el carácter ‘E’ tiene un código ASCII de 69.

    Cuando la cadena “xxE5xNx” se envía desde el Arduino a la Raspberry Pi, los valores de los códigos ASCII de cada carácter se envían como bytes. Estos bytes son luego recibidos por la Raspberry Pi y convertidos de vuelta a caracteres ASCII.

    Sin embargo, parece que el byte de ‘N’ se corrompe durante la transmisión, provocando que se convierta en el código ASCII de ‘@’. Esto podría deberse a varias razones, como ruido o interferencias en el bus I2C.

    Para solucionar este problema, una posible solución sería agregar mecanismos de verificación y corrección de errores al protocolo de comunicación, como sumas de comprobación o reintentos. Otra solución sería utilizar un protocolo de comunicación diferente, como SPI o UART, que pueden ser menos susceptibles a tales errores.

Comments are closed.