Pasando datos de Python a Arduino a través de Ethernet

3

Tengo un Arduino con Ethernet handshaking con mi máquina a través de Ethernet, y ahora quiero enviar datos entre ellos. Mi problema parece estar analizando correctamente los diferentes tipos de datos.

Por ejemplo, después de conectarme a mi servidor Arduino, mi script Python ejecuta esto

msg = "255"
print "Sending %s" % msg
data = s.send(msg)
s.close()

y todo lo que estoy buscando hacer ahora es imprimirlo en serie en Arduino (eventualmente haré cosas diferentes según la entrada).

Aquí está mi ciclo de ejecución en el Arduino.

void loop() {
     Client client = server.available();

     if (client == true) {
          int recv = client.read();    
          if (recv == 255)
               Serial.print("Received ");
          Serial.println(recv, DEC);
     }
}

Por alguna razón, solo se imprime un único carácter en blanco y no recibo ningún mensaje "recibido".

    
pregunta MechEngineer

2 respuestas

5

En Python, msg = "255" hará que msg sea un tipo de cadena usando esas comillas alrededor de 255.

Tu código Arduino está haciendo esta comparación: if(recv == 255)

Esto va a hacer una comparación de enteros. Una cadena "255" no va a ser igual al entero 255 y no estoy seguro de cómo se recibirán y formatearán los datos en Arduino usando client.read() , es probable que devuelva el primer byte de esa cadena.

En cualquier caso, tendrás que mantener las cosas consistentes byte por byte en tu código python y tu código arduino.

EDITAR:

Después de seguir leyendo:

client.read() Devoluciones El siguiente byte (o carácter), o -1 si no hay ninguno disponible. Por lo tanto, debe guardar esa función en un bucle y terminar en -1 (lo cual es una mala idea en mi opinión, en el caso de que desee enviar el valor -1 en su flujo de datos) o puede hacer lo que Joby Taffey sugirió, cree un protocolo básico e indique la cantidad de bytes de contenido que seguirá.

    
respondido por el Jon L
2

Como señaló Jon, su Arduino solo recibe un byte. TCP proporciona un flujo continuo de bytes, por lo que debe decidir cómo va a separar los mensajes.

Puede enviar un encabezado para indicar al receptor la duración del mensaje, o puede enviar un pie de página con un byte de terminación preseleccionado.

En el cable, los bytes de un mensaje con un encabezado pueden verse como { 3 , 'f' , 'o' , 'o' }. El receptor recibe el primer byte, luego sabe leer tres más antes de que se complete el mensaje. Una vez que se lee 3 bytes, espera otro encabezado.

Si usa un pie de página, el receptor escribe cada byte entrante en un búfer hasta que ve un carácter de terminación especial. Las cadenas C funcionan de esta manera, colocándolas "en el cable" puede ver { 'f' , 'o' , 'o' , 0 }. Este esquema permite cadenas infinitamente largas, pero requiere que el receptor tenga un búfer suficientemente grande para los datos entrantes. Tampoco permite que 0 aparezca en los mensajes. Cualquier esquema basado en un carácter de terminación no será 8-bit clean y necesitará un mecanismo de escape para pasar el binario datos.

Para datos legibles por humanos, es fácil trabajar con un pie de página de '\n' (el carácter de nueva línea). De esta manera, puede usar telnet / nc para interactuar con cada lado del sistema para realizar pruebas.

    
respondido por el Toby Jaffey

Lea otras preguntas en las etiquetas