Matlab通过串口与下位机通讯

这篇具有很好参考价值的文章主要介绍了Matlab通过串口与下位机通讯。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近用Matlab通过串口与STM32单片机通讯。Matlab在2019b版本以后,要用serialport串口函数集替换掉原有的serial串口函数集。Matlab的serialport串口工具说明文档并不完善,查了一些资料,实现了单字节中断回调式的串口接收。程序执行的效率高,并且在通讯过程中,不会阻塞主程序的运行。通讯程序主要有打开串口、串口通讯和关闭串口三个部分。

一、打开串口

在打开串口之前,要先用serialportlist()函数枚举所有的串口。然后从中选择需要通讯的设备,用serialport()函数打开,打开时要同时传入波特率参数。

devList = serialportlist("available");     % 枚举可用的串口。返回"COM1", "COM5"等
device = serialport(devList(2), 115200);   % 打开列表中的第二个串口,波特率设置为115200

二、串口通讯

Matlab程序可以用read()和write()函数进行串口通讯输入和输出。因为用read()输入数据需要指定读取的数据量,在接收完指定的数据量之前,read()函数是不返回的,程序会堵在那里。而低功耗MCU数据传输通常是不定时、不定长的,对这种数据传输来说,直接用read()输入就显得有那么一些笨拙了。所以Matlab还提供了中断回调的方式进行输入,在串口收到数据时,Matlab会主动调用指定的回调函数,在回调函数里就可以用read()函数把数据读出来,有多少就读多少。

定义回调函数是用configureCallback()函数。回调函数有两种触发方式:(1) 接收到设定的终止符时触发;(2) 接收到指定的字节数时触发。如果串口数据量不大,可以设置成接收到每个字节都产生一次中断,然后在中断程序中处理收到的数据。下面是设置回调函数的语句,其中ReceiveCallback()函数就是回调函数。设置完成后,串口只要接收到数据,就会调用ReceiveCallback()函数。

configureCallback(device, "byte", 1, @ReceiveCallback);  % 配置串口回调函数,接收到一个字节就调用一次ReceiveCallback()函数

回调函数的第一个参数dev是串口设备句柄,就是serialport()函数打开时返回的设备句柄,可以用来对串口进行操作。回调函数内容主要如下

function ReceiveCallback(dev, event)
	SerialBytesAvailable = get(dev, 'NumBytesAvailable');       % 获取串口缓存区中的数据量
	if SerialBytesAvailable > 0                                 % 判断是否有数据可读,如果可读则进行下一步读出的操作
 		DataReceive = read(dev, SerialBytesAvailable, "char");  % 读取数据
 		disp(DataReceive);
		% 用户数据处理
		% ……
	end
end

虽然在配置语句中,回调函数ReceiveCallback()应该是接收到一个字节就调用一次,但是在传输整块数据时,串口实际上是一次性接收一批数据的。为了加快执行速度,串口缓冲区有多少数据,可以一次性地全部读出来。缓冲区读空以后,Matlab还会按字节数老老实实地调用回调函数,但这时候缓冲区里已经没有数据了,所以就用不着执行read()指令读取数据了。

下图展示了串口分批传输了10131字节的数据,每次回调函数被调用执行时,实际读取的数据量。可以看到,回调函数的部分调用读取了几十到上百字节,但是更多次被调用时,缓冲区可供读取的数据量实际为0。

matlab串口发送和接收数据,Matlab,matlab,单片机,物联网

 Matlab从串口向MCU传输数据是比较简单的,直接调用write()函数就行了。

write(device, uint8([0xA5 0xA5 0x08 0x1F]), 'uint8');    % PC经串口输出4个字节的数据

三、关闭串口

Matlab的帮助里没有说怎样关闭串口。如果不关闭串口,以后就再用就打不开了。关闭串口的方法是清除设备句柄变量device,或者给device设备赋个值,Matlab就会释放device占据的串口。

clear device;    % device = []; <--这样也行

四、完整示例

在本示例的硬件环境下,STM32单片机在接收到4字节数据后,会发送10131字节的数据给PC。文章来源地址https://www.toymoban.com/news/detail-516598.html

% 打开串口,配置回调函数​
devList = serialportlist("available");     % 枚举可用的串口。返回"COM1", "COM5"等
device = serialport(devList(2), 115200);   % 打开列表中的第二个串口,波特率设置为115200
configureCallback(device, "byte", 1, @ReceiveCallback);  % 配置串口回调函数,接收到一个字节就调用一次ReceiveCallback()函数

% 向串口输出​​
write(device, uint8([0xA5 0xA5 0x08 0x1F]), 'uint8');    % PC经串口输出4个字节的数据。
% STM32单片机收到数据后,将通过串口向PC传送10131字节的数据
% 此处等待数据传输完毕,或者干别的事情……
pause(10)

​​% 关闭串口
clear device;    % device = []; <--这样也行

​​% 回调函数
function ReceiveCallback(dev, event)
	SerialBytesAvailable = get(dev, 'NumBytesAvailable');       % 获取串口缓存区中的数据量
	if SerialBytesAvailable > 0                                 % 判断是否有数据可读,如果可读则进行下一步读出的操作
 		DataReceive = read(dev, SerialBytesAvailable, "char");  % 读取数据
 		disp(DataReceive);
		% 用户数据处理
		% ……
	end
end

到了这里,关于Matlab通过串口与下位机通讯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 基于STM32F1以及STM32CubeMx实现串口中断通讯(字符串发送与接收)

    基于STM32F1以及STM32CubeMx实现串口中断通讯(字符串发送与接收)

    首先选好自己的板子并打开软件设置,本实验基于STM32F103ZET6实现,打开软件后如图: 打开外部高速晶振,然后接着配置时钟: 将时钟频率修改为72MHz,接着设置接线方式为SW 接下来需要使用串口中断通讯,打开我们的串口设置并打开中断 这里波特率设置为115200,数据位为

    2024年02月09日
    浏览(10)
  • STM-32:USART串口协议、串口外设—数据发送/数据发送+接收

    STM-32:USART串口协议、串口外设—数据发送/数据发送+接收

    通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统。比如STM32芯片里面集成了很多功能模块,如定时器计数、PWM输出、AD采集等等,这些都是芯片内部的电路,它们的配置寄存器、数据寄存器都在芯片里面,操作简单,直接读写就行。但是有些功能STM32内部没有

    2024年02月04日
    浏览(42)
  • 串口通信-发送和接收数据

    串口通信-发送和接收数据

    目录 通信方式 硬件电路 软件部分 USART外设(同步/异步收发器) 波特率 引脚复用 初始化基本流程 发送 接收 语言简述 常用的函数 使用的结构体 引脚模式 打印数据的三种方法 使用printf 在实际的串口中,只能发送二进制数,也就是十六进制的最直接数据。如果想发送字符,

    2024年02月12日
    浏览(45)
  • 基于MATLAB App搭建STM32用户交互界面(1)——MATLAB与STM32串口通讯的实现

    基于MATLAB App搭建STM32用户交互界面(1)——MATLAB与STM32串口通讯的实现

            最近几个月,DIY了块板子,选用的芯片是STM32F407,该板子与上位机(也就是电脑)的通讯方式有两种,一是用串口发送程序进程数据,二是用网口发送原始数据。在调试时,需要用XCOM接收串口信息、用XNET接收网口信息。由于这块板子是用来学术研究的,数据每次

    2024年02月09日
    浏览(6)
  • Matlab上位机——串口收发、接收转为图像实时显示、图像放大缩小等功能

    Matlab上位机——串口收发、接收转为图像实时显示、图像放大缩小等功能

    原例程代码可以进行串口接收发送,加载与存储数据 本人在例程代码的基础上添加了共三个功能 1.加载文件数据,三通道同时显示波形 2.放大缩小 3.均值滤波 4.将接收到的数据以固定位数转换为实时波形 布局 加载文件数据后(excel的csv格式) 滤波效果 实时波形采集当时忘了

    2024年02月02日
    浏览(13)
  • 串口发送数据,只接收到00的原因之一

    串口发送数据,只接收到00的原因之一

    1、环境: STM32F103RCT6 KEIL 5 2、现象: 不管我发送任何类型的数据,在串口助手上显示接收到的都是00, 我头很大,去网上找了别人的代码对比检查。 终于,细心的我发现,原来粗心的我少了一行代码。 3、解决方案1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); 好了,加上这一行

    2024年02月12日
    浏览(49)
  • 最详细STM32,cubeMX串口发送,接收数据

    最详细STM32,cubeMX串口发送,接收数据

    这篇文章将详细介绍 串口 发送数据,接受数据。 实验开发板:STM32F103C8T6。 所需软件:keil5 , cubeMX 。 实验目的:了解 串口的基础知识,掌握串口如何发送,接收数据 。 实验:串口发送数据点亮 led。 如果想了解串口的基础知识可以参考我之前的文章: STM32Cube串口USART发送

    2024年02月04日
    浏览(46)
  • STM32实现三个串口同时开启发送接收数据

    STM32实现三个串口同时开启发送接收数据

            实现STM32开通三个串口,每个串口都可以实现接收和发送数据。          编程时,严禁在中断函数中写入发送串口数据代码,否则会出错,具体原因不清楚(有大佬知道的话帮我指出),可能原因是DR寄存器冲突导致。         RX,TX连接到A9,A10使用串口1,使

    2024年04月13日
    浏览(48)
  • C#串口通信从入门到精通(26)——多个串口多个线程发送数据和接收数据

    C#串口通信从入门到精通(26)——多个串口多个线程发送数据和接收数据

    我们在开发串口程序的过程中有时候会遇到多个串口,并且多个串口也需要在多个线程进行操作,本文就来讲解如何实现多个串口在多线程下的安全发送与接收。 我们首先使用虚拟串口助手虚拟COM1、COM2这一对串口;COM3、COM4这一对串口,然后使用代码操作COM1,然后打开一个

    2024年02月11日
    浏览(42)
  • Qt+C++串口调试接收发送数据曲线图

    Qt+C++串口调试接收发送数据曲线图

    程序示例精选 Qt+C++串口调试接收发送数据曲线图 如需安装运行环境或远程调试,见文章底部个人 QQ 名片,由专业技术人员远程协助! 这篇博客针对Qt+C++串口调试接收发送数据曲线图编写代码,代码整洁,规则,易读。 学习与应用推荐首选。 一、所需工具软件 二、使用步骤

    2024年02月11日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包