MATLAB串口通讯实验(一)

前言

因工作原因需要通过串口进行数据采集并分析,考虑到经常使用的数据分析工具是MATLAB,而网上关于MATLAB串口实验相关的帖子均写的不清不楚,最终导致我采了很多的坑,因此特意将MATLAB串口相关的操作进行总结并记录,也希望能帮到大家。

MATLAB串口数据接收仿真实验
串口函数使用serialport及serial两种
软件工具包括:串口调试助手 + 虚拟串口工具 + MATLAB

本文所设计到的虚拟串口驱动,串口调试助手及MATLAB代码我已经按照0积分进行打包上传至我的资源,链接在这,如有需要可以下载使用。

虚拟串口建立

Step 1. 打开虚拟串口配置工具,然后使用它生成配对的虚拟串口,选择两个串口号,点击“添加串口”该驱动就会生成两个已经连接的虚拟串口。
在这里插入图片描述

串口调试助手充当传感器发送数据

Step 1. 为了进行测试,这边使用串口助手发送三角波数据,具体为:4 6 8 10 12 14 16 18 20 18 16 14 12 10 8 6 4 2 。
Step 2. 使用串口助手打开端口26(选择自己设置的虚拟串口中的一个),并设置波特率,我这边选择的是115200。
Step 3. 打开“定时发送后”,点击“发送”按钮串口调试助手就会不断发送数据了。
在这里插入图片描述

MATLAB充当上位机接收并解析数据

Step 1. 进行串口配置

clc;clear all;close all;
%% 串口配置
%---- 使用serialport进行串口配置 ----%
Port_List = serialportlist("available")   % 显示可用的串口信息
SerialObj = serialport("COM25",115200);   % 串口参数配置

data = read(SerialObj,300,"uint8" );  
% 一次读取一个字节,将每个字节解释为一个 8 位无符号整数 (uint8),并返回一个 double 数组
% 此处读取了300个字节
% data_hex = dec2hex(data);

delete(SerialObj);                    % 使用完一定记得删除串口占用

%---- 使用serial进行串口配置 ----%
instrfind                             % 查看已有的串口信息
delete(instrfind);                    % 关闭遗忘的串口
port = 'COM25';                       % 端口号选择dataport
baudrate = 115200;                    % 波特率设置921600bit等于115200个字节
S = serial(port,'baudrate',baudrate); % 串口设置
S.InputBufferSize = 300;              % 输入串口缓冲区上限10000字节               
S.Timeout = 5;                        % Timeout为完成读取或写入操作的等待时间,如果未指定其他值,则使用默认值 10 秒

try
  fopen(S);                           % 打开串口对象
catch err
  fclose(instrfind);                  % 关闭被占用的串口
  error('请确认选择了正确的串口');      % 输出错误提示
end
instrfind                             % 查看已有的串口信息(牢记使用虚拟串口时打开后需要记得关闭)

data = fread(S);                      % 直接将所有的数据进行接收,除非数据长度超过了数据缓存区的长度,超过即不显示,又或者超出等待时间
fclose(S)
delete(S)                             % 使用完一定记得删除串口占用

这边一共介绍了两种串口配置方式,选择使用一种即可。第一种是使用“serialport”函数进行配置。
本文仅配置了串口号及波特率,其余的均设置为默认值。

使用该函数配置的串口可以配合“read”函数进行串口数据的读取,该函数是一次读取一个字节,并将每个字节解释为一个 8 位无符号整数 (uint8),最后返回一个 double 数组(返回的类型和接收的长度可以自己设置)。这边的逻辑就是接收到指定长度才会停止接收。如图所示,代码中设置的300,所以工作区data矩阵的长度是300。
在这里插入图片描述

第二种方式是采用“serial”函数进行配置,该函数的使用方式和“serialport”是不一样的,其配置方式详见代码,关键参数是等待时间及输入缓冲区的大小。和“serial”不一致的地方在于,这两个参数任意一个到达预设值,都会停止采集,例如:等待时间10s,但是缓冲区大小仅为5,那么在接收到5个字节后就会停止接收数据,又或者等待时间1s,缓冲区大小为50000,那么在接收到1s数据后就会停止,并不会等待缓冲区塞满。
假设参照代码执行的话最终会接收到245个字节
在这里插入图片描述
注意:使用完串口一定要记得删除串口的占用,否则后续使用虚拟串口驱动删除串口是删除不了的。

Step 2. 数据处理

由于MATLAB在接收到数据后是直接按照10进制进行展示的,而此处的串口助手在发送数据时则是按照字符进行发送。为了清晰地展示数据还需要进行相应的处理。例如上文发送的是4 6 8 10 12 14 16 18 20 18 16 14 12 10 8 6 4 2,那么MATLAB接收到数据则是52 32 54 32 56 32 …,这边转换规则是按照ASCII表进行,具体如下图所示:
在这里插入图片描述

52对应的是4,32对应的是空格,54对应的6…,所以需要按照相应的规则将数据进行解析处理,我这边写的处理代码如下:

%% 串口数据解析及展示
line = 1;
colum = 1;
for i = 1 : length(data)
    if (data(i) == 13 || data(i) == 10) %排除换行及回车
       continue; 
    end
    
    if (data(i) == 32)                  %空格间隔数据
       line = line + 1; 
       colum = 1;
       continue;
    end
    
    Data_matrix(line , colum) = data(i);
    colum = colum + 1;
end

for i = 1 : size(Data_matrix,1)
    for j = 1 : 2
        Data_matrix(i,j) = Data_matrix(i,j) - 48;
    end
end


Data_real(size(Data_matrix,1),1) = 0;
for i = 1 : size(Data_matrix,1)
    if (Data_matrix(i,2) == -48)
        Data_real(i,1) = Data_real(i,1) + Data_matrix(i,1);
    else
        Data_real(i,1) = Data_matrix(i,2) + Data_matrix(i,1) * 10;
    end   
end

figure;
plot(Data_real);
xlabel('Serial Number');ylabel('Amplitude')

最终可以成功将发送的数据成功接收并进行绘制展示,具体如下图所示:
在这里插入图片描述

实验结束

在测试完成后记得删除串口占用并删除配置的虚拟串口。

总结

本文介绍了两种方式进行串口的配置,并通过仿真详细展示了具体的操作步骤,下一篇文章将展示如何利用MATLAB充当便携的上位机来发送指定的数据,从而可以配合相应的移动设备实现相应的功能。

额外说明

MATLAB串口通讯实验室完全免费阅读的文章,里面涉及的资源也就以1积分下载(可以做任务白嫖),不清楚像“m0_67244366”的这类用户是想干嘛,麻烦以后喷人也找准点目标,骂人也找不清理由,可笑。
如果各位不想看,直接右上角关闭走人,别搁网上当个“键盘侠”。
在这里插入图片描述

  • 35
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: MATLAB串口通讯程序用于在MATLAB中与串口设备进行通信。在使用串口通讯之前需要先确定好串口设备的连接和参数设置。下面是一个简单的MATLAB串口通讯程序示例: ```matlab % 创建串口对象 s = serial('COM1'); % 设置串口参数 set(s, 'BaudRate', 9600); set(s, 'DataBits', 8); set(s, 'StopBits', 1); set(s, 'Parity', 'none'); % 打开串口 fopen(s); % 发送数据 dataToSend = 'Hello'; fwrite(s, dataToSend); % 接收数据 dataReceived = fread(s, s.BytesAvailable); % 关闭串口 fclose(s); delete(s); clear s; ``` 以上示例中,首先创建了一个串口对象,并设置了串口参数,如波特率、数据位、停止位和校验位等。然后使用`fopen`函数打开串口连接。接着可以使用`fwrite`函数向串口发送数据,也可以使用`fread`函数接收从串口接收到的数据。最后使用`fclose`函数关闭串口连接,并删除并清除掉使用的串口对象。 需要注意的是,在实际使用中,可能需要根据具体的串口设备和通信协议进行一定的定制化操作,如添加数据处理、错误检查和超时处理等。此外,还可以使用MATLAB的工具箱和函数扩展串口通讯的能力,如通过`MATLAB Instrument Control Toolbox`中的函数来进行更高级的串口通讯操作。 总之,MATLAB串口通讯程序可以方便地实现与串口设备的数据交互,提供了简单而灵活的API,可以满足各种串口通讯需求。 ### 回答2: MATLAB串口通讯程序是用来与外部设备进行数据交互的程序。在MATLAB中,我们可以通过串口通讯实现与硬件设备(如传感器、执行器等)的数据读取和发送。 下面是一个简单的MATLAB串口通讯程序示例: 1. 首先,我们需要创建一个与外部设备进行通信的串口对象。可以使用以下代码: ```matlab s = serial('COM1'); % 创建串口对象,COM1代表串口号 ``` 2. 接下来,我们可以设置串口的参数,如波特率、数据位数、停止位等。以下是一个设置波特率为9600、数据位数为8位、停止位为1位的示例代码: ```matlab set(s, 'BaudRate', 9600); set(s, 'DataBits', 8); set(s, 'StopBits', 1); ``` 3. 现在,我们可以打开串口并建立与设备的连接: ```matlab fopen(s); % 打开串口 ``` 4. 数据的读取和发送是串口通讯的核心功能之一。可以使用以下代码来读取从设备发送的数据: ```matlab data = fread(s, n); % 读取n个字节的数据 ``` 其中n代表读取的字节数。同样,我们也可以使用以下代码将数据发送给设备: ```matlab fwrite(s, data); % 发送数据给设备 ``` 5. 最后,当通讯结束时,我们需要关闭串口并释放资源: ```matlab fclose(s); % 关闭串口 delete(s); % 删除串口对象 clear s; % 清除串口对象 ``` 以上就是一个简单的MATLAB串口通讯程序示例。在实际应用中,我们可以根据具体的需求进行数据处理和控制操作,实现与外部设备的可靠通讯。 ### 回答3: MATLAB是一个强大的数值计算和科学仿真软件,也提供了与外部设备进行串口通信的功能。在MATLAB中,我们可以使用Serial对象来建立与串口设备的通信连接,并通过串口发送和接收数据。 首先,我们需要使用MATLAB的serial函数创建一个Serial对象。在创建Serial对象时,我们需要指定串口号、波特率、数据位数等参数。例如,下面的代码创建了一个与COM1串口的连接,波特率为9600,数据位数为8位的Serial对象: s = serial('COM1','BaudRate',9600,'DataBits',8); 接下来,我们可以使用fopen函数将Serial对象与串口设备建立连接: fopen(s); 连接建立后,我们可以使用fread函数从串口接收数据,使用fwrite函数向串口发送数据。这两个函数的语法分别为: data = fread(s,num_bytes); fwrite(s, data); 其中,s是Serial对象的名称,num_bytes是要接收的字节数,data是要发送的数据。 在进行串口通信时,我们可能还需要设置串口的其他参数,例如校验位、停止位等。可以使用set函数来设置Serial对象的属性,如: set(s,'Parity','none'); set(s,'StopBits',1); 最后,当我们不再需要与串口设备通信时,可以使用fclose函数关闭串口连接: fclose(s); 这是一个简单的示例,说明如何使用MATLAB进行串口通信。根据具体的应用需求,我们可以根据Serial对象的各种方法和属性来实现更复杂的串口通信功能。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值