本文主要整理了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 | 为与串行端口设备的通信设置回调函数和触发条件 |
data = read(device,count,datatype)
说明:从串行端口连接 device 以 datatype 指定的格式读取 count 个值。
示例:read(device,5,‘unit32’) 从串行端口连接device读取格式为unit32的5个数据,每个unit32值为4个字节,共读取20个字节。
data = readline(device)
说明:从串行端口连接读取 ASCII 数据,直到第一次出现终止符,并以不带终止符的字符串形式返回 data。
write(device,data,datatype)
说明:将行向量或列向量 data 写入指定的串行端口连接 device。该函数以指定的数据类型 datatype 写入数据,而不考虑 data 中的格式。
示例:
write(device,1:5,“int16”) 以 int16 数据类型格式写入数据,写入值为1 ,2 ,3 ,4 ,5。
write(device,[20:24],“int16”) 写入值 [20,21,22,23,24]。
writeline(device,data)
说明:将 ASCII 文本 data(后跟终止符)写入指定的串行端口。该函数暂停 MATLAB® 的执行,直到写入了数据和终止符。
示例:
writeline(device,"*IDN?") 写入 ASCII 字符串 “*IDN?”
flush(device)
flush(device,“input”)
flush(device,“output”)
说明:
flush(device) 刷新指定的串行端口的输入和输出缓冲区中的所有数据。
flush(device,“input”) 仅清空输入缓冲区。
flush(device,“output”) 仅清空输出缓冲区。
configureTerminator(device,terminator)
configureTerminator(device,readterminator,writeterminator)
说明:
示例:
configureTerminator(device,“CR”,10) 将读取终止符设为CR,写入终止符设为10
查看终止符:device.Terminator
configureCallback(device,“terminator”,callbackFcn)
configureCallback(device,“byte”,count,callbackFcn)
configureCallback(device,“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)
status = getpinstatus(device)
说明:status = getpinstatus(device) 获取串行引脚状态并将其作为结构体返回给 status。
setRTS(device,true)
setRTS(device,false)
说明:
setRTS(device,true) 设置指定的串行请求发送 (RTS) 引脚。
setRTS(device,false) 重置指定的 RTS 引脚。
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); % 发送命令,数据开始传输