IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> MATLAB与51单片机进行串口通信详解 -> 正文阅读

[嵌入式]MATLAB与51单片机进行串口通信详解

一、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写入到已连接obj对象的设备中去。

fprintf(serial)
将文本写入设备

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

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

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

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

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

三、串口属性

首先定义端口后,端口s会有许多属性,如下图所示。
在这里插入图片描述
其中常用的有:

  • 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的结果如下:
在这里插入图片描述
这里设置的size为10而只接收到9个数据的原因是:
由于设置从51单片机中每隔一秒发来一次数据0x66,而MATLAB中serial的Timeout(截止时间)默认为10s,因此还没有接收到第十个数据,serial就截止了,因此就存在设置的size为10而只接收到9个数据的现象了。
解决方案也很简单,方法1:将51单片机中每隔一秒发送一次数据修改为每隔0.5秒或更短发送一次数据;方法2:将Timeout适度延长,修改后输出如下图所示:
在这里插入图片描述

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

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

MATLAB简单代码如下:

delete(instrfindall);
s = serial('COM3','BaudRate',4800);%创建串口,设置波特率
fopen(s);
fprintf(s,'FE');         % 给串口写入数据
str = fscanf(s)           %读取串口数据

fclose(s);
delete(s);

向串口写入FE点亮第一个LED灯。

五、总结

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

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

参考:

  1. https://blog.csdn.net/caliburrrr/article/details/79591279
  2. https://www.csdn.net/tags/MtTacgwsMjU2NzktYmxvZwO0O0OO0O0O.html
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:36:52  更:2022-04-24 09:37:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:55:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码