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>
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.