MATLAB 的串口连接


前言

本文主要整理了MATLAB2021a文档中对于serialport及相关函数的描述及用法
在验证时采用的虚拟串口来源于https://blog.csdn.net/qq_17351161/article/details/89607458


相关函数

连接函数:serialport
s = serialport(port,baudrate)
s = serialport(port,baudrate,Name,Value) 连接到串行端口,并使用可选的名称-值对组参数设置其他属性。
示例: s = serialport(“COM3”,9600,“Timeout”,5);

对象函数见下表

名称作用
read从串行端口读取数据
readline从串行端口读取ASCII字符串数据行
write将数据写入串行端口
writeline将ASCII数据行写入串行端口
flush清空串行端口设备缓冲区
configureTerminator为与串行端口的ASCII字符串通信设置终止符
configureCallback为与串行端口设备的通信设置回调函数和触发条件
getpinstatus获取串行引脚状态
setRTS设置串行RTS引脚
setDTR为与串行端口设备的通信设置回调函数和触发条件

1. read 从串口读取数据

data = read(device,count,datatype)

说明:从串行端口连接 device 以 datatype 指定的格式读取 count 个值。

  • device: serialport 创建的对象
  • count: 要读取的值的数目
  • datatype: 每个值的大小和格式,指定为字符向量或字符串,有如下类型格式 “uint8” | “int8” | “uint16” | “int16” | “uint32” | “int32” | “uint64” | “int64” | “single” | “double” | “char” | “string”

示例:read(device,5,‘unit32’) 从串行端口连接device读取格式为unit32的5个数据,每个unit32值为4个字节,共读取20个字节。


2. readline 从串行端口读取 ASCII 字符串数据行

data = readline(device)

说明:从串行端口连接读取 ASCII 数据,直到第一次出现终止符,并以不带终止符的字符串形式返回 data。


3. write 将数据写入串行端口

write(device,data,datatype)

说明:将行向量或列向量 data 写入指定的串行端口连接 device。该函数以指定的数据类型 datatype 写入数据,而不考虑 data 中的格式。

  • device: serialport 创建的对象
  • data: 数值或 ASCII 数据,指定为由数值组成的 1×N 向量或文本类型的字符向量或字符串标量
  • datatype: 每个值的大小和格式,指定为字符向量或字符串,有如下类型格式 “uint8” | “int8” | “uint16” | “int16” | “uint32” | “int32” | “uint64” | “int64” | “single” | “double” | “char” | “string”

示例
write(device,1:5,“int16”) 以 int16 数据类型格式写入数据,写入值为1 ,2 ,3 ,4 ,5。
write(device,[20:24],“int16”) 写入值 [20,21,22,23,24]。


4. writeline 将 ASCII 数据行写入串行端口

writeline(device,data)

说明:将 ASCII 文本 data(后跟终止符)写入指定的串行端口。该函数暂停 MATLAB® 的执行,直到写入了数据和终止符。

示例
writeline(device,"*IDN?") 写入 ASCII 字符串 “*IDN?”


5. flush 清空串行端口设备缓冲区

flush(device)
flush(device,“input”)
flush(device,“output”)

说明
flush(device) 刷新指定的串行端口的输入和输出缓冲区中的所有数据。
flush(device,“input”) 仅清空输入缓冲区。
flush(device,“output”) 仅清空输出缓冲区。


6. configureTerminator 为与串行端口的 ASCII 字符串通信设置终止符

configureTerminator(device,terminator)
configureTerminator(device,readterminator,writeterminator)

说明

  1. configureTerminator(device,terminator) 定义与指定的串行端口进行读写通信的终止符。允许的终止符值是 “LF”(默认值)、“CR”、“CR/LF” 以及 0 到 255的整数值。该语法设置 device 的 Terminator 属性。 设置终止符后,使用 writeline 和 readline写入和读取以 ASCII 字符结尾的字符串数据。
  2. configureTerminator(device,readterminator,writeterminator) 为读取和写入通信定义单独的终止符。

示例
configureTerminator(device,“CR”,10) 将读取终止符设为CR,写入终止符设为10

查看终止符:device.Terminator


7. configureCallback 为与串行端口设备的通信设置回调函数和触发条件

configureCallback(device,“terminator”,callbackFcn)
configureCallback(device,“byte”,count,callbackFcn)
configureCallback(device,“off”)

说明

  1. configureCallback(device,“terminator”,callbackFcn) 将回调函数 callbackFcn 设置为每当可从指定的串行端口读取终止符时触发。该语法将 device 的 BytesAvailableFcnMode 属性设置为 “terminator”,将 BytesAvailableFcn 属性设置为 callbackFcn。
  2. configureCallback(device,“byte”,count,callbackFcn) 将回调函数 callbackFcn 设置为每当有新的 count 个字节可供读取时触发。该语法将 device 的 BytesAvailableFcnMode 属性设置为 “byte”,将 BytesAvailableFcnCount 属性设置为 count,将 BytesAvailableFcn 属性设置为 callbackFcn。
  3. configureCallback(device,“off”) 关闭回调。该语法将 device 的 BytesAvailableFcnMode 属性设置为 “off”。

示例
1.configureCallback(device,“byte”,128,@callbackFcn) 将 callbackFcn 回调设置为每当有 128 个字节的新数据可供读取时触发。
2.创建一个回调函数,该函数读取以 ASCII 结尾的字符串数据,并将其保存到 device 的 UserData 属性中。

function readSerialData(src,evt)
    data = readline(src);
    src.UserData = data;
end
// 将回调设置为当终止符可供读取时触发。
configureCallback(device,"terminator",@readSerialData)


8. getpinstatus 获取串行引脚状态

status = getpinstatus(device)

说明:status = getpinstatus(device) 获取串行引脚状态并将其作为结构体返回给 status。


9. setRTS 设置串行 RTS 引脚

setRTS(device,true)
setRTS(device,false)

说明
setRTS(device,true) 设置指定的串行请求发送 (RTS) 引脚。
setRTS(device,false) 重置指定的 RTS 引脚。


10. setDTR 设置串行 DTR 引脚

setDTR(device,true)
setDTR(device,false)

说明
setDTR(device,true) 设置指定的串行数据终端就绪 (DTR) 引脚。
setDTR(device,false) 重置指定的串行 DTR 引脚。


虚拟串口测试

1.首先使用虚拟串口创建COM1,COM2,左边virtual ports部分说明已经成功创建

在这里插入图片描述

2.用XCOM选择COM1,MATLAB连接COM2,各参数需设置相同

// MATLAB串口连接,发送“hi”消息
s1 = serialport('COM2',115200,"Timeout",0.5);   % 虚拟串口测试
writeline(s1,"hi"); 

3.XCOM收到消息并发送“hello”
在这里插入图片描述
4.打开MATLAB工作区中的s1。
可看到串口的各项数据,其中NumBytesAvailable 代表串口输入缓冲区接受的字节数为7,NumBytesWritten 代表串口输出缓冲区发送的字节数为3。在串口发送与接受过程中,每个字符默认为1字节大小,缓冲区大小与发送数据大小不同的原因将在下面进行介绍。

在这里插入图片描述

5.将XCOM中收到的字符转为hex格式
得到 “68 69 0A” ,对照ASCII码,68 69代表hi,而0A代表换行符,发送其他字符试了下,最后都带有一个换行符,因而发送数据时会多一字节。
在这里插入图片描述

6.在MATLAB中用read函数读取数据
数据格式为uint8,read(s1,7,“uint8”),结果为“104 101 108 108 111 13 10”对照ASCII表为“hello+归位键+换行键”,继续尝试发现MATLAB接受的数据末尾都会带上归位键+换行键,因而会产生
接受数据大小增加2字节的情况。


实际串口测试

本次连接的串口波特率为250000,“Timeout”=0.5

// 连接串口
s1 = serialport('COM6',250000,'Timeout',0.5);

串口收到“WAVE”命令后,开始向MATLAB发送数据,在测试中发现发送的WAVE命令实际上还需要加上归位键以及换行键,但在实际发送中难以直接用字符串形式发送。采用char函数嵌套hex2dec函数的方式实现该命令。

hexstr1 = ["57" "41" "56" "45" "0D" "0A"];    % WAVE 信号的16进制表示
start_sig = char(hex2dec(hexstr1));
writeline(s1,start_sig);     % 发送命令,数据开始传输
  • 11
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值