Search code examples
matlabdrop-down-menucallbackserial-portmatlab-figure

Error while trying to connect to open COM port


I'm trying to connect to my micro controller using Matlab GUI. The first step is setting up the elements, my window consists of 4 axes, 1 popup window (to choose the com port) and 3 push buttons, "connect, "start, and stop" I need the user to choose the COM port, which will be opened once "connect" is pressed. Here is my interface:

enter image description here

Here is my code :

function varargout = gui2(varargin)
% GUI2 MATLAB code for gui2.fig
%      GUI2, by itself, creates a new GUI2 or raises the existing
%      singleton*.
%
%      H = GUI2 returns the handle to a new GUI2 or the handle to
%      the existing singleton*.
%
%      GUI2('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in GUI2.M with the given input arguments.
%
%      GUI2('Property','Value',...) creates a new GUI2 or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before gui2_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to gui2_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help gui2

% Last Modified by GUIDE v2.5 02-Mar-2017 15:10:00

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
    'gui_Singleton',  gui_Singleton, ...
    'gui_OpeningFcn', @gui2_OpeningFcn, ...
    'gui_OutputFcn',  @gui2_OutputFcn, ...
    'gui_LayoutFcn',  [] , ...
    'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before gui2 is made visible.
function gui2_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to gui2 (see VARARGIN)

global comport ;
global COMnum ;


% Choose default command line output for gui2
handles.output = hObject;


% Update handles structure
guidata(hObject, handles);

% UIWAIT makes gui2 wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = gui2_OutputFcn(hObject, eventdata, handles)
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;


% --- Executes on button press in Connect1.
function Connect1_Callback(hObject, eventdata, handles)
% hObject    handle to Connect1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
COMnum = get(handles.COM2,'String');
comport = serial(COMnum, 'BaudRate', 115200); % setup comport
comport.InputBufferSize = 500000;
flushinput(comport);
fopen(comport);



% --- Executes on button press in Start1.
function Start1_Callback(hObject, eventdata, handles)
% hObject    handle to Start1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)


% --- Executes on button press in Stop1.
function Stop1_Callback(hObject, eventdata, handles)
% hObject    handle to Stop1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% --- Executes on selection change in COM2.
function COM2_Callback(hObject, eventdata, handles)
% hObject    handle to COM2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: contents = cellstr(get(hObject,'String')) returns COM2 contents as cell array
%        contents{get(hObject,'Value')} returns selected item from COM2
Com=get(handles.COM2,'string');
setappdata(0,'COM',Com);
guidata(hObject, handles);


% --- Executes during object creation, after setting all properties.
function COM2_CreateFcn(hObject, eventdata, handles)
% hObject    handle to COM2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: popupmenu controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

My problem is that when I run this program I get the following error:

gui2


Error using serial (line 107)
Cannot create: No constructor with appropriate signature exists in Java class com.mathworks.toolbox.instrument.SerialComm

Error in gui2>Connect1_Callback (line 87)
comport = serial(COMnum, 'BaudRate', 115200); % setup comport

Error in gui_mainfcn (line 95)
        feval(varargin{:});

Error in gui2 (line 42)
    gui_mainfcn(gui_State, varargin{:});

Error in
matlab.graphics.internal.figfile.FigFile/read>@(hObject,eventdata)gui2('Connect1_Callback',hObject,eventdata,guidata(hObject))

Error while evaluating UIControl Callback

Why is that happening?

Thanks


Solution

  • Looking at the examples section of the documentation of uicontrol, we can see that the String property of a 'popup' (aka dropdown) holds a cell array:

    % Create pop-up menu
    popup = uicontrol('Style', 'popup',...
           'String', {'parula','jet','hsv','hot','cool','gray'},...
           'Position', [20 340 100 50],...
           'Callback', @setmap);   
    

    This is why, when you're calling

    COMnum = get(handles.COM2,'String');
    comport = serial(COMnum, 'BaudRate', 115200); % setup comport
    

    You're passing serial a cell array for a first argument, while it is expecting a string.

    What can be done about this? The documentation tells us this as well:

    The Value property stores the row indexes of currently selected list box items

    For it to work you should do something like:

    comport = serial(COMnum{get(handles.COM2,'Value')}, 'BaudRate', 115200);
    

    I suggest you look into debugging - it contains useful tips that could've helped you find the problem on your own.