MATLAB与51单片机进行串口通信详解

目录

    • 一、51单片机与电脑进行串口通信
    • 二、MATLAB串口通信函数
    • 三、串口属性
    • 四、示例Demo
      • 4.1 MATLAB接收单片机发来的数据
      • 4.2 MATLAB向单片机发送数据控制LED
    • 五、总结

一、51单片机与电脑进行串口通信

关于51单片机与电脑进行串口通信在前文已经介绍过了,有兴趣的可以参考文章:51单片机之串口通信详解及代码示例。

二、MATLAB串口通信函数

Matlab并不具备直接访问硬件的能力,但是支持面向对象技术,通过调用Instrument Control Toolbox中的serial类函数来创建串口对象,对串口对象操作就是对串口操作,使用起非常方便。同时,Matlab封装的串口对象支持对串口的异步读写操作,使得计算机在读写串口时能同时进行其他处理工作,因而能大大提高计算机执行效率。Matlab用多线程技术实现这种异步操作,通过异步读写设置,计算机在执行读写串口函数时能立即返回不必等待串口把数据传输完毕,当指定的数据传输结束时就触发事件,执行事件回调函数,可以在事件回调函数中编程,进行数据处理,这样就不会造成因等待串口传输数据引起的时间浪费。

delete(instrfindall)
删除所有串口设备
有的时候虽然关闭了串口,但是上面仍然显示占用,,这个时候就需要这一句。

serial
创建串口对象

s=serial(‘port’,‘baudrate’,4800);
在创建对象期间指定属性波特率为4800。baudrate–波特率,表示该串口每秒传送数据的量bit。

fopen(serial)
将串口对象连接到设备上
执行读写操作之前,必须使用fopen函数将串口对象(s)连接到设备

fread(serial)
从设备中读取二进制数据

A=fread(s,size);
从与端口对象连接的设备中读取二进制数据并返回给A,size指定要读取的值的最大数目,若未指定size,则由对象中的InputBufferSize属性定义。
a=fread(obj,40); %读取40字节。 并存到a中

fscanf(serial)
从串口serial读取字符或字符串(ASCII码)形式数据

A = fscanf(obj,‘format’,size) 读取 size 指定的值的数目并根据 format 进行转换。format 是 C 语言转换说明。转换设定涉及 % 字符和转换字符 d、i、o、u、x、X、f、e、E、g、G、c 和 s。

fwrite(serial)
将二进制数据写入设备

fwrite(s,A);
将二进制数据A写入到已连接s对象的设备中去。
fwrite(obj,A,‘precision’)
按照 precision 指定的精度写入二进制数据。
precision 控制为每个值写入的位数以及如何将这些位解释为整数、浮点数或字符值。如果未指定 precision,则使用 uchar(8 位无符号字符)。常用的为uint8(无符号8位整数)

fprintf(serial)
将文本写入设备

fprintf(s,‘sdfh’);
将字符串写入与s相连接的设备中。

fclose(serial)
断开串口对象与设备之间的联系。

总结】:当MATLAB通信数据采用西方(ASCII码)方式时,读写串口设备命令分别是fscanf和fprintf;当MATLAB通信数据采用二进制方式时,读写串口设备命令分别是fread和fwrite

dec2hex
将十进制整数转换为其十六进制表示形式

D = 1023;
hexStr = dec2hex(D)%hexStr=‘3FF’

三、串口属性

首先定义端口后,端口s会有许多属性,如下图所示。
MATLAB与51单片机进行串口通信详解_第1张图片
其中常用的有:

  • BaudRate:波特率,默认为9600;
  • Status:当前状态(未打开时时closed,打开之后是open);
  • Timeout:截止时间,默认为10s;

四、示例Demo

4.1 MATLAB接收单片机发来的数据

51单片机代码可以参考:Demo1:单片机向电脑每隔一秒发送递增数据。

MATLAB完整代码如下:

%释放串口资源
delete(instrfindall);
s = serial('COM3','BaudRate',4800);%创建串口,设置波特率
% 查询串口是否已经打开
if(s.Status == "closed")
    % 打开串口
	fopen(s);
	if(s.Status == "open")
        fprintf(1,'串口打开成功\n'); 
    else
        fprintf(1,'串口打开失败\n');     
    end  
else
	fprintf(1,'串口被占用\n'); 
end 

size = 10;%设置数据大小
rx = fread(s,size);
fclose(s);
delete(s);
data=dec2hex(rx);   %将数据转换为十六进制

此时,若设置从51单片机中每隔一秒发来一次数据0x66,即UART_SendByte(0x66);,则此时MATLAB中rx和data的结果如下:
MATLAB与51单片机进行串口通信详解_第2张图片
这里设置的size为10而只接收到9个数据的原因是:
由于设置从51单片机中每隔一秒发来一次数据0x66,而MATLAB中serial的Timeout(截止时间)默认为10s,因此还没有接收到第十个数据,serial就截止了,因此就存在设置的size为10而只接收到9个数据的现象了。
解决方案也很简单,方法1:将51单片机中每隔一秒发送一次数据修改为每隔0.5秒或更短发送一次数据;方法2:将Timeout适度延长,修改后输出如下图所示:
MATLAB与51单片机进行串口通信详解_第3张图片

4.2 MATLAB向单片机发送数据控制LED

51单片机代码可以参考:Demo2:单片机接收电脑发送数据并点亮相应LED灯并将数据返还电脑端显示。

MATLAB简单代码如下:

delete(instrfindall);
s = serial('COM3','BaudRate',4800);%创建串口,设置波特率
fopen(s);

data=hex2dec('FE');%FE——254(十六进制转十进制)
fwrite(s,data,"uint8");
rx = fread(s,1);

fclose(s);
delete(s);

向串口写入FE点亮第一个LED灯。这里使用十进制数(变量data)写入,不能直接使用十六进制(“FE”)。这里将precision进行设置,设置为"uint8",也可不进行设置。
运行效果如下:
MATLAB与51单片机进行串口通信详解_第4张图片
只点亮第一个LED灯,并且rx返回十进制数254,也可将rx转为二进制:

dec2bin(rx)

运行结果:
‘11111110’

五、总结

利用MATLAB的串口功能与一般的串口调试助手的功能是一样的,都能准确地读写数据,可以接受和发送一般十六进制数。

ok,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~

参考:

  1. https://blog.csdn.net/caliburrrr/article/details/79591279
  2. https://www.csdn.net/tags/MtTacgwsMjU2NzktYmxvZwO0O0OO0O0O.html
  3. https://zhuanlan.zhihu.com/p/408798468
  4. http://cn.voidcc.com/question/p-ynerkkyl-pr.html

你可能感兴趣的:(51单片机,MATLAB,单片机,51单片机,串口通信,matlab)