MATLAB Answers

0

Serial Port opening problem

I'm trying to acquire values from a microcontroller using the serial port. However, I'm facing a strange bug!
when I try to run the program for the first time it works and when I try to run it again it gives me an error saying that cannot open the port! But if I close matlab and open it again and run the program it works for the first time only and then same problem arises!
Can anyone help me please ?
Thanks in advance

  5 Comments

Ruger28
on 4 Nov 2019
Without seeing your code, it seems like what Walter is getting at is that you are not closing it after you are done, and on the next iteration you are trying to open it up while it is open already. Try closing it when you are done.
I will try then to remove try and catch and close after my code is done and see!
thanks a lot for your help
Here is the code from the tutorial I'm following in this link https://os.mbed.com/cookbook/Interfacing-with-Matlab
function accell()
TIMEOUT = 5; %time to wait for data before aborting
XPOINTS = 50; %number of points along x axis
try
%create serial object to represent connection to mbed
mbed = serial('COM4', ...
'BaudRate', 9600, ...
'Parity', 'none', ...
'DataBits', 8, ...
'StopBits', 1); %change depending on mbed configuration
set(mbed,'Timeout',TIMEOUT); %adjust timeout to ensure fast response when mbed disconnected
fopen(mbed); %open serial connection
position = 1; %initialise graph variables
time = 1;
x = [(1:XPOINTS)' (1:XPOINTS)' (1:XPOINTS)'];
xlabels = (1:XPOINTS);
y = zeros(XPOINTS,3);
% in my CASE I'm NOT having the CONDITION to be alwase TRUE as in here
while (1) %loop forever (or until an error occurs)
values = fscanf(mbed, '%f,%f,%f'); %get values into vector
%assumes data formatted as
%'1,2,3'
y(position,:) = values'; %put into y to be displayed
%update position on x-axis and x-axis labels
xlabels(position) = time;
time = time + 1;
if (position < XPOINTS)
position = position + 1;
else
position = 1;
end
%display
plot(x,y);
set(gca, 'XTick', 1:XPOINTS);
set(gca, 'XTickLabel', xlabels);
drawnow; %this is required to force the display to update before the function terminates
end
fclose(mbed); %close connection (this should never be reached when using while(1), but included for completeness)
catch
%in case of error or mbed being disconnected
disp('Failed!');
fclose(mbed); %close connection to prevent COM port being lokced open
end

Sign in to comment.

Products


Release

R2019b

1 Answer

Answer by Murugan C on 5 Nov 2019
 Accepted Answer

Hi
you should check, how many ports are open and closed using instrfind syntax in matlab.
>> instrfind
Instrument Object Array
Index: Type: Status: Name:
1 serial closed Serial-COM4
2 serial closed Serial-COM4
3 serial closed Serial-COM1
4 serial closed Serial-COM1
5 serial closed Serial-COM1
6 serial closed Serial-COM1
7 serial open Serial-COM1
now, easily we can close all ports using fclose. and should delete that object.
fclose(instrfind)
delete(mbed)
correct your as like below..
try
mbed = serial('COM1', ...
'BaudRate', 9600, ...
'Parity', 'none', ...
'DataBits', 8, ...
'StopBits', 1); %change depending on mbed configuration
.......
catch
%in case of error or mbed being disconnected
disp('Failed!');
fclose(mbed);
fclose(instrfind);
delete(mbed);
end

  1 Comment

Thanks Murugan and everyone for the help it worked out!

Sign in to comment.