Parsing data from serial port

10 visualizaciones (últimos 30 días)
Daniel
Daniel el 11 de Abr. de 2016
Comentada: Daniel el 19 de Abr. de 2016
Hi,
I communicate with a DsPIC
i have a constant format for a message:
HEADER1 HEADER2 OPCODE DATA CHECKSUM (no spaces)
in my MATLAB GUI i want to read the incoming message, chk if i get the HEADER1 I EXPCT, then chk to see i get HEADER2 i expect , if so: get OPCODE and DATA and do with that something
how can i split my message?
thought about switch;case
wanted to know if there is something more "elegant"
Thanks
  2 comentarios
Walter Roberson
Walter Roberson el 11 de Abr. de 2016
Is that a text format or a numeric format? are the headers variable length? How can you tell when HEADER1 stops and HEADER2 begins?
Daniel
Daniel el 11 de Abr. de 2016
Editada: Walter Roberson el 11 de Abr. de 2016
headers ARE FIXED
header1: 55
header2: AA
if i get a sequence of 55AA i know now comes the opcode then the data
if i get 55555555555 i wait for AA because HEADER1 was recieved
if i get 55AF i wait to get 55 again because sequence 55AA was not recieved

Iniciar sesión para comentar.

Respuesta aceptada

Walter Roberson
Walter Roberson el 11 de Abr. de 2016
You need a Finite State Machine. The Mathworks tools for that are http://www.mathworks.com/discovery/finite-state-machine.html but you probably do not need anywhere near the full power of that.
current_state = 0;
while true
this_input = fread(s, 1, 'uint8');
if feof(s); break; end
if state == 0 && this_input == 88 %0x55
current_state = 1;
elseif current_state == 1 && this_input == 170 %0xAA
current_state = 2;
now read the opcode and data and so on.
When you are through with it
current_state = 0;
else
current_state = 0;
end
end
  6 comentarios
Walter Roberson
Walter Roberson el 14 de Abr. de 2016
"persistent". Or a shared variable if you need to be able to reset the state.
Daniel
Daniel el 19 de Abr. de 2016
I'll try here: so i set in the "connect" button the following:
handles.SerPIC.BytesAvailableFcn = {'@intcon1',handles};
set(handles.SerPIC,'BytesAvailableFcnMode','byte');
set(handles.SerPIC,'BytesAvailableFcnCount', 1);
and the call back function is:
if true
function intcon1(hObject, eventdata, handles)
persistent current_state
persistent L;
persistent i;
persistent DATA;
persistent recieved_checksum;
% current_state = 0;
% while (handles.SerPIC.BytesAvailable >= 1)
this_input = fread(handles.SerPIC,1);
switch current_state
case 0 % state 0 wait for HEADER_1
L=0;
i=0;
DATA=0;
recieved_checksum=0;
if (this_input == 85)
current_state = 1;
else
current_state = 0;
end
case 1 % state 1 wait for HEADER_2
if (this_input == 51) %was 170
current_state = 2;
recieved_checksum = 136;
elseif (this_input == 85)
current_state = 1;
else
current_state = 0;
end
case 2 % state 2 wait for message length
MESSAGE_LENGTH = this_input;
L=MESSAGE_LENGTH;
i=1;
current_state = 3;
recieved_checksum = mod(recieved_checksum + this_input,255);
case 3
% if (s.BytesAvailable == MESSAGE_LENGTH)
DATA(i) = this_input;
recieved_checksum = mod(recieved_checksum + this_input,255);
i=i+1;
L = L - 1;
if L > 0
current_state = 3;
else
current_state = 4;
end
case 4
recieved_checksum = recieved_checksum - this_input;
if (recieved_checksum ==0)
set(handles.temp_read,'string',[num2str(DATA(1))])
set(handles.voltage_read,'string',[num2str(DATA(2))])
set(handles.current_read,'string',[num2str(DATA(3))])
current_state = 0;
else
current_state = 0;
end
end
guidata(hObject,handles)
end
but nothing seems to happen. and i get an error:
if true
Error using feval
Invalid function name '@intcon1'.
Error in instrcb (line 36)
feval(val{1}, obj, eventStruct, val{2:end});
Warning: The BytesAvailableFcn is being disabled. To enable the callback property
either connect to the hardware with FOPEN or set the BytesAvailableFcn property.
end

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre MATLAB en Help Center y File Exchange.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by