如何使用MATLAB进行串行通信

通信网络

624人已加入

描述

MATLAB 是多功能软件,可用于各种应用。在MATLAB之前的教程中,我们已经解释了如何使用MATLAB来控制直流电机,伺服电机和家用电器。在本教程中,我们将学习如何使用 MATLAB 进行串行通信。对于串行通信的接收端,我们在这里使用Arduino。

有两种方法可以在MATLAB和Arduino之间设置串行通信,一种是使用命令窗口,另一种是使用MATLAB GUI。两种方法的Arduino代码将保持不变。

所需组件

MATLAB 安装笔记本电脑(偏好:R2016a 或更高版本)

Arduino UNO

指示灯(任何颜色)

电阻器(330欧姆)

电路图

串行通信

 

串行通信

对于在MATLAB和Arduino之间建立串行通信的两种方法,上面的电路图将保持不变。

使用 MATLAB 命令窗口进行串行通信

这是在Arduino和MATLAB之间设置串行通信的简单方法。在这里,我们将简单地使用命令窗口将数据从 MATLAB 串行发送到 Arduino,然后 Arduino 读取传入的串行数据。然后,这种串行传输的数据可用于控制连接到Arduino的任何内容。在这里,我们将LED连接到Arduino,它将根据Arduino串行接收的数据打开和关闭。

首先,在Arduino UNO中上传给定的Arduino代码,然后在MATLAB编辑器窗口中开始编码。要打开新的编辑器脚本,请单击“新脚本”,如下图所示:

串行通信

然后,将以下完整的 MATLAB 代码复制并粘贴到编辑器窗口中,以便在 MATLAB 和 Arduino 之间进行串行通信。

%MATLAB Code for Serial Communication between Arduino and MATLAB

x=serial('COM18','BAUD', 9600);

fopen(x);

go = true;

while go

 

a= input('Press 1 to turn ON LED & 0 to turn OFF:');

fprintf(x,a);  

if (a == 2)

go=false;

end

end

串行通信

在给定的代码中,以下命令用于定义 MATLAB 中的串行通信。确保com端口号是Arduino连接的端口号,并且在Arduino和MATLAB的代码中应设置相同的波特率。

x=serial('COM18','BAUD', 9600);

要打开串行端口,请使用以下命令,

fopen(x);

以下命令用于将数据从 MATLAB 串行发送到 Arduino,其中 x 用于调用串行,a 是用户输入的值。

fprintf(x,a);  

我们使用while函数来创建无限循环,每当用户输入数字“2”时,循环就会中断。

while go               

a= input('Press 1 to turn ON LED & 0 to turn OFF:');

fprintf(x,a);  

if (a == 2)

go=false;

end

end

完成 MATLAB 编辑器脚本编码后,单击“RUN”以运行您的程序,如下图所示,

串行通信

MATLAB 需要几秒钟来处理代码并开始串行通信,等到 MATLAB 在软件屏幕的左下角显示“BUSY”消息,如下图所示。

串行通信

现在,您将看到用于发送用户输入的命令窗口,我们已经设置了默认消息,

'Press 1 to turn ON LED & 0 to turn OFF:'

串行通信

发送“1”打开 LED,发送“0”关闭 LED,发送“2”中断操作。您可以为任何任务设置任何数字,您所要做的就是相应地更改Arduino代码。最后给出了完整的Arduino代码。

串行通信

使用 MATLAB GUI 的串行通信

为了演示使用 MATLAB GUI 的串行通信,我们将使用 MATLAB 创建两个图形按钮来打开和关闭连接到 Arduino 的 LED。数据将从 MATLAB 串行发送到 Arduino,单击这些按钮以打开和关闭 LED。Arduino将包含从MATLAB接收串行数据并根据接收到的串行数据控制LED的代码。Arduino 代码将与前一个代码保持相同,唯一的区别是,以前我们通过 MATLAB 的命令窗口发送串行数据“1”和“0”,现在将在两个图形按钮上点击发送相同的数据。

要启动 GUI,请在命令窗口中键入以下命令

guide

将打开一个弹出窗口,然后选择新的空白GUI,如下图所示,

串行通信

现在选择两个按钮来打开和关闭 LED,如下所示,

串行通信

要调整按钮的大小或更改按钮的形状,只需单击它,您就可以拖动按钮的角。通过双击按钮,您可以更改该特定按钮的颜色,字符串和标签。我们自定义了两个按钮,如下图所示。

串行通信

 

串行通信

您可以根据自己的选择自定义按钮。现在,当您保存此代码时,将在 MATLAB 的编辑器窗口中生成一个代码。根据您希望使用 MATLAB GUI 由 Arduino 执行的任务编辑此代码。

将以下代码复制并粘贴到第 74 行以设置串行端口和波特率。

clear all;

global x;

x=serial('COM18','BAUD', 9600); % Make sure the baud rate and COM port is

% same as in Arduino IDE

fopen(x);

串行通信

其中,fopen(x) 用于打开串行端口进行串行通信。

向下滚动时,您将看到为 GUI 中的两个按钮创建了两个函数。现在,根据要在单击时执行的任务在两个函数中编写代码。

在LED-ON按钮的功能中,在功能结束之前复制并粘贴以下代码以打开 LED。正如你在下面的代码中看到的,fprintf(x,1) 用于将串行数据从 MATLAB 发送到 Arduino 串行。在这里,我们将“1”发送到Arduino串行,如果您检查Arduino代码,您会发现Arduino将通过使其13千引脚为高电平,当它的串行端口上收到“1”时。

global x;

fprintf(x,1);

串行通信

在LED-OFF按钮的功能中,在功能结束之前复制并粘贴以下代码以关闭 LED。正如你在下面的代码中看到的,fprintf(x,0) 用于将串行数据从 MATLAB 发送到 Arduino 串行。在这一部分中,我们将“0”发送到Arduino串行,如果您检查Arduino代码,您会发现Arduino将通过使其13千引脚低电平,当它的串行端口上收到“0”时。

global x;

fprintf(x,0);

串行通信

完成 MATLAB GUI 编码并根据电路图设置硬件后,只需单击运行按钮即可在 .m 文件中运行编辑后的代码。

串行通信

MATLAB 可能需要几秒钟才能响应,在 MATLAB 显示 BUSY 指示之前不要单击任何 GUI 按钮,您可以在屏幕的左下角看到,如下所示,

串行通信

一切准备就绪后,单击 LED 打开和 LED 关闭按钮以打开和关闭 LED。当您按下 LED 亮起按钮时,13千Arduino 的引脚变为高电平,连接到此引脚的 LED 开始发光,当您按下 LED 关闭按钮时,13千Arduino的引脚变为低电平,使LED关闭。

Arduino Code for Serial Communication between MATLAB and Arduino


int value;


void setup()

{

Serial.begin(9600);

pinMode(13, OUTPUT);

}


void loop()

{

if(Serial.available()>0)

{

value=Serial.read();


if (value == 1) 



digitalWrite(13, HIGH);

}

if(value == 0) 



digitalWrite(13, LOW);

}

}

}





MATLAB Code for Serial Communication using MATLAB GUI


function varargout = final(varargin)


gui_Singleton = 1;

gui_State = struct('gui_Name', mfilename, ...

'gui_Singleton', gui_Singleton, ...

'gui_OpeningFcn', @final_OpeningFcn, ...

'gui_OutputFcn', @final_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


handles.output = hObject;


guidata(hObject, handles);


function varargout = final_OutputFcn(hObject, eventdata, handles) 


varargout{1} = handles.output;

clear all;

global x;

x=serial('COM18','BAUD', 9600); % Make sure the baud rate and COM port is 

% same as in Arduino IDE

fopen(x);



function turnonled_Callback(hObject, eventdata, handles)


global x;

fprintf(x,1);



function turnoffled_Callback(hObject, eventdata, handles)


global x;

fprintf(x,0);
 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分