Hola a todos. En primer lugar, desearia presentarme, ya que soy nuevo en el foro.
Os paso a exponer el problema con el que estoy estancado hace unos días.
Dispongo de dos nodos de sensores con base Arduino Uno, que a través de ZigBee, mandan una vez por hora los datos de tres sensores al coordinador. El formato es una cadena de 4 integers de 16 bit. Tres para los datos de los sensores, y un cuarto, con la id 16 bits del modulo ZigBee, para identificar el nodo del que provienen los datos.
El coordinador, cuando un nodo actualiza datos, por ejemplo, el 1, imprime al serial una cadena de seis floats, en que los tres primeros valores són los recibidos del nodo 1, y los tres restantes, los últimos valores disponibles del nodo 2.
Serial.print(T950001);
Serial.print(",");
Serial.print(T950002);
Serial.print(",");
Serial.print(E950000);
Serial.print(",");
Serial.print(T950011);
Serial.print(",");
Serial.print(T950012);
Serial.print(",");
Serial.println(E950010);
Y esto es lo que se obtiene el el monitor serie:
106.51,106.51,5.18,150.56,150.56,-5.60
La idea es capturar la cadena con Matlab, partirla en valores individuales, y enviarlos a un canal de Thingspeak.
He probado varias soluciones. La última de ellas es esta:
%clear all;
s1 = serial('COM6'); %define serial port
set(s1,'BaudRate',9600,'Parity','None');
timeout = 120000;
fopen(s1);
%evalin('data', 's1');
% readasync(s1);
s.BytesAvailableFcnCount = 12;
s.BytesAvailableFcnMode = 'byte';
while(s1.BytesAvailable == 0) %wait until Arduino outputs data
while(1)
%readasync(s1);
% while(s1.BytesAvailable > 1)
data = fscanf(s1); %read sensor
% data = fread(s1,6,'double');
flushinput(s1);
disp(data);
%disp(count)
%count = count+1;
end
end
% close the serial port!
fclose(s1);
Pero a pesar de obtener los datos, estos vienen acompañados por un mensaje de error, que me hace sospechar que el comando "Bytesavailable" no lo he usado correctamente y se esta leyendo el puerto de forma continuada.
Warning: Unsuccessful read: A timeout occurred before the Terminator was reached.
Warning: Unsuccessful read: A timeout occurred before the Terminator was reached.
Warning: Unsuccessful read: A timeout occurred before the Terminator was reached.
97.06,97.06,5.07,138.98,138.98,5.54
La parte de Thingspeak la he probado aparte, y ya está resuelta.
Por favor, agradeceré cualquier tipo de ayuda en la depuración de este script, y la parte de aislar la cadena en 6 valores individuales puesto que mis conocimientos de Matlab son limitados (todavía).
Muchas gracias.