Effacer les filtres
Effacer les filtres

Parsing data from serial port

19 vues (au cours des 30 derniers jours)
Daniel
Daniel le 11 Avr 2016
Commenté : Daniel le 19 Avr 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 commentaires
Walter Roberson
Walter Roberson le 11 Avr 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 le 11 Avr 2016
Modifié(e) : Walter Roberson le 11 Avr 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

Connectez-vous pour commenter.

Réponse acceptée

Walter Roberson
Walter Roberson le 11 Avr 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 commentaires
Walter Roberson
Walter Roberson le 14 Avr 2016
"persistent". Or a shared variable if you need to be able to reset the state.
Daniel
Daniel le 19 Avr 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

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur MATLAB dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by