Buenas tardes a todos! Estoy queriendo armar un codigo para poder enviar y recibir datos entre una Raspberry con python y un Arduino Due utilizando comunicacion SERIAL.
La idea es que el Arduino pueda tanto enviar como recibir datos dependiendo la orden que le emita la Raspberry (Yo lo llamo flags).
Entonces La raspberry le envia una Flag, el arduino lo procesa y ejecuta algun codigo.
Hasta ahi todo bien, el problema me surge cuando quiero pasarle un array al arduino.
Necesito enviarle 14 valores de LONG. Para esto le señalo la operacion a realizar con la flag adecuada (En este caso, flag = '8').
Luego de recibir esa flag, el arduino entra a un ciclo for donde itera 14 veces, igual a la longitud de elementos a recibir. Dentro de cada ciclo, le puse un while para que espere a que halla un dato disponible y, si recibe un dato, entonces que lo pase nuevamente por el serial para poder ver que es lo que recibe el arduino desde la consola de python.
Mi codigo de python es el siguiente:
import serial
arduino = serial.Serial(port='COM3', baudrate=115200, timeout=0.1, write_timeout=0.1)
def send_data(flag,data=None):
arduino.reset_input_buffer()
arduino.write(str(flag).encode('ascii'))
init_t=time.time()*1000
while(arduino.inWaiting()<1 and init_t+20>time.time()*1000):
a=1
if not init_t+200>time.time()*1000:
raise ConnectionError('Arduino no responde a la FLAG')
recived=arduino.read(5).decode('ascii')
print("Flag: ",recived)
if flag in recived:
if data:
for value in data:
arduino.write(str(value).encode('ascii'))
init_t=time.time()*1000
while(arduino.inWaiting()<1 and init_t+1000>time.time()*1000):
a=1
recived=arduino.read(10).decode('ascii')
arduino.reset_input_buffer()
print("recibimos: ",recived)
arduino.reset_input_buffer()
arduino.reset_output_buffer()
send_data('8',[17123123,17123123,17123123,17123123,17123123,17123123,17123123,17123123,17123123,17123123,17123123,17123123,17123123,17123123])
El de Arduino:
void clearSerialBuffer() {
if (Serial.available()){
String value = "";
while(Serial.available()){
char data= Serial.read();
value=value+data;
}
}
}
void catchLISTValue(){
for(int i=0; i<14;i++){
while (Serial.available()<=0){}
Serial.print(Serial.read()-48);
}}
void setup() {
Serial.begin(115200);
}
void loop() {
if (Serial.available() > 0){
ord = Serial.read()-48;
if(ord==8){
clearSerialBuffer();
Serial.print("8");
catchLISTValue();
}
Cuando ejecuto mi codigo en python, recibo la siguiente salida:
Puerto Usado: COM3
Flag: 8
recibimos:
recibimos: 7
recibimos: 7
recibimos: 7
recibimos: 7
recibimos: 7
recibimos: 7
recibimos: 7
recibimos: 7
recibimos: 7
recibimos: 7
recibimos: 7
recibimos: 7
recibimos: 7
Como se aprecia, el arduino responde con la misma flag, indicando que entro al ciclo que se desea. Pero los valores no son correctos. Si intento enviar otros valores, a veces no me responde nada las primeras 5/6 iteracciones. Si saben que puedo estar haciendo mal, se los agradeceria!!