前言:
一个完整的通讯,除了数据的接收也应该包含数据的发送。在串口通讯实验(一)中博主介绍了如何利用MATLAB的串口函数来接收数据并解析,这一章将介绍如何通过MATLAB代码将数据通过串口进行发送。
仿真工具
a. 虚拟串口
通过虚拟串口工具新建两个互联的端口,如上图所示建立的是COM20和COM21。
b. 串口调试工具
将串口调试工具模拟下位机接收数据,如上图所示是将调试工具连接至COM20,波特率设置为115200。
仿真过程
第一步:通过虚拟串口构建一组可用串口,本次实验构建串口为20及21,二者进行互联,构建结果可以在设备管理器进行查看;
第二步:通过Matlab代码配置上位机串口相关参数,这边设置上位机串口号为21,波特率为115200(波特率需要和下位机设置一致),传递数据可以任意设置;
第三步:通过write函数将数据写入串行端口;
write(device,data,datatype) 将行向量或列向量 data 写入指定的串行端口连接 device。该函数以指定的数据类型 datatype 写入数据,而不考虑 data 中的格式。其中:
device – 串行端口连接(serialport 对象)
data – 数值或 ASCII 数据(数值 | 字符向量 | 字符串标量)
datatype – 每个值的大小和格式
第四步:通过串口调试工具充当下位机检查接收的数据信息;
仿真代码展示
% MATLAB串口仿真实验(二)配套代码
% 串口数据发送实验
% 本实验用于测试串口数据发送实验
% 串口函数使用serialport及serial两种
% 软件工具包括:串口调试助手 + 虚拟串口工具
clc;clear all;close all;
%% 串口配置
%---- 使用serialport进行串口配置 ----%
Port_List = serialportlist("available") % 显示可用的串口信息
SerialObj = serialport("COM21",115200); % 串口参数配置
instrfind % 查看已有的串口信息(牢记使用虚拟串口时打开后需要记得关闭)
%---- 使用serial进行串口配置 ----%
instrfind % 查看已有的串口信息
delete(instrfind); % 关闭遗忘的串口
port = 'COM21'; % 端口号选择dataport
baudrate = 115200; % 波特率设置921600bit等于115200个字节
SerialObj = serial(port,'baudrate',baudrate); % 串口设置
try
fopen(SerialObj); % 打开串口对象
catch err
fclose(instrfind); % 关闭被占用的串口
error('请确认选择了正确的串口'); % 输出错误提示
end
instrfind % 查看已有的串口信息(牢记使用虚拟串口时打开后需要记得关闭)
%% 数据发送实验
send_data = ["Hello world" newline "Hello world" newline]; %字符串类型的数据
send_data = [1 2 3 4 5 6 7 8 9 10]; %数值型数据
for i = 1:length(send_data)
write(SerialObj,send_data(1,i), "uint32" ); %注意发送数据的类型
pause(0.03);
end
%% 删除串口
delete(SerialObj); % 使用完一定记得删除串口占用
结果展示
如上图所示是MATLAB按照“uint8”,“uint16”,“uint32”的格式将数据1 2 3 4 5 6 7 8 9 10下发后串口助手按照16进制采集显示,可以发现都正确接收了,且格式相互对应。注意MATLAB下发时是按照“小端模式”进行的,因此“01 00 00 00”显示的对应32位数据应该是“00000001”。
需要注意的是如果没有勾选16进制显示会显示上图这种乱码。
如上图所示是MATLAB按照“uint8”,“uint16”,“uint32”的格式将字符串 [“Hello world” newline “Hello world” newline]下发后串口助手按照16进制采集显示,可以发现都正确接收了,且格式相互对应。其中,newline是MATLAB中的换行符。
此外字符串的16进制解读需要参考ASCII表,例如“H”字符对应的是16进制0x48,ASCII表的完整展示在串口通讯实验(一)中有展示,这边就不再放出。
需要注意的是如果没有勾选16进制显示会显示对应的字符串
总结:
上面总结了如何利用MATLAB模拟上位机按照预期的数据格式下发参数给下位机,再了解了该功能后就可以在缺乏上位机的情况下对我们编写的下位机代码进行测试。