MATLAB Answers

Serial Port opening problem

80 views (last 30 days)
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


Show 2 older 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.
Abdel Rahman Bekawi
Abdel Rahman Bekawi on 4 Nov 2019
I will try then to remove try and catch and close after my code is done and see!
thanks a lot for your help
Abdel Rahman Bekawi
Abdel Rahman Bekawi on 5 Nov 2019
Here is the code from the tutorial I'm following in this link
function accell()
TIMEOUT = 5; %time to wait for data before aborting
XPOINTS = 50; %number of points along x axis
%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
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;
position = 1;
set(gca, 'XTick', 1:XPOINTS);
set(gca, 'XTickLabel', xlabels);
drawnow; %this is required to force the display to update before the function terminates
fclose(mbed); %close connection (this should never be reached when using while(1), but included for completeness)
%in case of error or mbed being disconnected
fclose(mbed); %close connection to prevent COM port being lokced open

Sign in to comment.

Accepted Answer

Murugan C
Murugan C on 5 Nov 2019
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.
correct your as like below..
mbed = serial('COM1', ...
'BaudRate', 9600, ...
'Parity', 'none', ...
'DataBits', 8, ...
'StopBits', 1); %change depending on mbed configuration
%in case of error or mbed being disconnected

  1 Comment

Abdel Rahman Bekawi
Abdel Rahman Bekawi on 5 Nov 2019
Thanks Murugan and everyone for the help it worked out!

Sign in to comment.

More Answers (0)




Community Treasure Hunt

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

Start Hunting!

Translated by