Estoy trabajando en un proyecto Arduino, y estoy interactuando con una secuencia de comandos de Python debido a limitaciones de memoria. En el lado de Python, tengo una matriz bidimensional que contiene los respectivos valores x, y para las coordenadas, y en esta lista hay 26000 pares de coordenadas. Por lo tanto, a fin de aclarar la estructura de datos para todos ustedes, pathlist[0][0]
, devolvería el valor X de la primera coordenada de mi lista. Realizar diferentes operaciones, etc. en esta lista en Python no plantea problemas. Sin embargo, cuando estoy teniendo problemas, envío estos valores a Arduino en serie, de una manera que sea útil.Comunicación en serie de Python
Debido a la naturaleza de la comunicación serial (al menos creo que este es el caso) debo enviar cada entero como una cadena, y solo un dígito a la vez. Entonces, un número como 345 sería enviado como 3 caracteres individuales, siendo por supuesto, 3, 4, luego 5.
Lo que estoy luchando es encontrar la manera de reconstruir esos enteros en el Arduino.
Cada vez que envíe un valor superior, que está recibiendo los datos y la salida de él de este modo:
//Python is sending over the number '25'
2ÿÿ52
//Python is sending the number 431.
4ÿÿ321ÿÿÿ2
El código de Arduino es:
String str;
int ds = 4;
void setup() {
Serial.begin(9600);
}
void loop(){
if (Serial.available()>0) {
for (int i=0; i<4; i=i+1) {
char d= Serial.read();
str.concat(d);
}
char t[str.length()+1];
str.toCharArray(t, (sizeof(t)));
int intdata = atoi(t);
Serial.print(intdata);
}
}
Y el código Python se ve así:
import serial
s = serial.Serial(port='/dev/tty.usbmodemfd131', baudrate=9600)
s.write(str(25))
Estoy casi seguro de que el problema no proviene del método de salida (Serial.print
), ya que cuando declaro otro int, formatea bien en el resultado, entonces asumo que el problema radica en cómo se construye la variable intdata
.
Una cosa de la nota que puede ayudar a diagnosticar este problema es que si cambio Serial.print(intdata)
a Serial.print(intdata+5)
mi resultado es 2ÿÿ57
, donde esperaría 30 (25 + 5). Este 7 está presente independientemente de la entrada. Por ejemplo, yo podría escribir 271 a la serie y mi resultado se vería de la siguiente manera:
//For input 271.
2ÿÿ771ÿÿÿ7
Me parece que Arduino se CHUNKING los valores en pares de dos y añadiendo la longitud hasta el final. No puedo entender por qué sucedería eso.
También me parece que el ÿ
se está agregando en el ciclo for. Lo que significa que se agregan porque no se envía nada en ese momento. Pero incluso arreglando eso agregando otro if(Serial.available()>0)
condicional, el resultado todavía no se trata como un entero.
Además, ¿sería apropiado usar Pickle aquí? ¿Qué estoy haciendo mal?
¿Por qué es esto etiquetado 'java'? – NPE
@aix Bueno, pensé que Arduino estaba basado fuera de Java y, por lo tanto, el conocimiento de Java sería aplicable. Con mucho gusto lo cambiaré si me equivoco: D – danem
Es solo el IDE de Arduino el que está escrito en Java. Su código que se ejecuta en el Arduino está en C, por lo que Java no es relevante para la pregunta. – NPE