【Matlab】串口通信(serialport对象,读写、回调、删除等)
文章目录
- 一、串口 基本概念
- 二、matlab 串口
- 2.1 创建串口
- 2.2 串口对象的函数
- 2.21 读取
- 2.22 写入
- 2.23 回调:configureCallback
- 2.24 删除串口对象
- 2.3 其它函数
- 2.31 列出已经打开的串口
- 2.32 列出系统的串口
本文介绍的是matlab比较新的函数,不是即将删除的serial()
、fclose()
等函数。
软件:
- Matlab 2024b,使用最新的吧,2025a就要发布了。
- 串口调试助手:微软商店随便下载的,用啥都行。
- Virtual Serial Port Driver:创建一对虚拟连接的虚拟串口。
一、串口 基本概念
基本概念
- 全称:串行通信接口(
Serial Port
),是一种用于逐位传输数据的通信接口。 - 核心特点:数据按顺序一位接一位传输(串行),与并行接口(多位同时传输)形成对比。
- 历史地位:曾是计算机与外部设备(如鼠标、调制解调器)连接的主要方式,现多用于工业和嵌入式领域。
技术特性
参数 | 说明 |
---|---|
波特率 | 数据传输速率(如9600、115200 bps),需通信双方一致。 |
数据位 | 每帧数据位数(5-9位,常用8位)。 |
停止位 | 标志数据包结束(1、1.5或2位)。 |
校验位 | 错误检测(奇校验、偶校验、无校验)。 |
流控制 | 防数据丢失(硬件:RTS/CTS;软件:XON/XOFF)。 |
物理接口标准
标准 | 特点 |
---|---|
RS-232 | 短距离(<15米),±3~15V电平,全双工,常用于PC与老式设备。 |
RS-422 | 差分信号,抗干扰强,距离可达1200米,支持单点多发。 |
RS-485 | 多点通信(32设备),工业环境主流,半双工/全双工。 |
工作模式
- 全双工:同时收发(如RS-232,类似电话通话)。
- 半双工:收发不能同时(如RS-485,类似对讲机)。
- 同步通信:需时钟信号同步(如SPI、I2C)。
- 异步通信:无时钟线,依赖波特率(如UART)。
优缺点
串口的主要优点就是便宜、简单;但是传输距离短、速度慢;若有更高需求,可以考虑无线传输(wifi、蓝牙、NFC等)、USB传输、网线传输(RJ-45)等。
优点 | 缺点 |
---|---|
结构简单,成本低 | 传输速率低(通常<1Mbps) |
长距离通信可靠(RS-485) | 功能单一(仅传输数据) |
抗干扰强(差分信号) | 逐渐被USB、以太网取代 |
🟢现在电脑基本是没有物理串口的。只有USB、雷电、RJ-45、DP、HDMI、PCIE、3.5mm、SD卡等端口。
所以,通常使用USB转串口的芯片(CH340、CP2102等)与单片机等进行串口通信(当然,单片机很多也支持网线、USB等)。
打开你的电脑的设备管理器,随看不到物理串口,但可能看到这种:蓝牙连接上的标准串行(COM3)
这是通过蓝牙技术连接的设备在计算机上被识别为一个虚拟的串行端口(COM 端口),主要是连接蓝牙鼠标、键盘这些使用的。
本文也使用软件创建一对虚拟串口,这样就可以在2个程序中进行串口通信了。
☘️ 软件:Virtual Serial Port Driver:https://www.virtual-serial-port.org/
(这是我用的,应该还有其它的)
(也可以自己写代码创建,本文不介绍)
二、matlab 串口
2.1 创建串口
也可以自己看matlab文档。
主要函数:serialport
s = serialport(port,baudrate)
s = serialport(port,baudrate,Name,Value)
s = serialport
serialport 对象表示与串行端口通信的串行客户端。在创建对象后,请使用圆点表示法设置其属性。
-
s = serialport(port,baudrate)
连接到 port 指定的串行端口,波特率为 baudrate。 -
s = serialport(port,baudrate,Name,Value)
连接到串行端口,并使用可选的名称-值对组参量设置其他属性。 -
s = serialport(不带参量)使用上次清除的 serialport 对象实例的属性设置连接到串行端口。保留的属性包括 Port、BaudRate、ByteOrder、FlowControl、StopBits、DataBits、Parity、Timeout 和 Terminator。请参阅属性。
第一个就是最简单的,默认8数据位,1停止位,端口和波特率自己设定即可。
第二个则是指定一些属性:
🟢这些属性可以读取、也可以修改
属性名称 | 描述 | 默认值 | 数据类型 | 示例 | 备注 |
---|---|---|---|---|---|
Port | 用于连接的串行端口,以字符串形式返回。 | 无默认值 | string | “COM1” | 此属性为只读。 |
BaudRate | 通信速度,以位/秒为单位。 | 无默认值 | single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | 14400 | 双精度正整数形式返回。 |
Parity | 用于检查数据是否丢失或写入的奇偶校验。 | “none” | char | string | “odd” | 可选值:“none”、“even”、“odd”。 |
DataBits | 表示一个数据字符的位数。 | 8 | single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | 8 | 可选值:8、7、6、5。 |
StopBits | 指示字符结束的位的模式。 | 1 | single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | 1 | 可选值:1、1.5、2。 |
FlowControl | 管理数据传输速率的模式。 | “none” | char | string | “software” | 可选值:“none”、“hardware”、“software”。 |
ByteOrder | 字节排列成较大数值的顺序。 | “little-endian” | char | string | “little-endian” | 可选值:“little-endian”、“big-endian”。 |
Timeout | 允许的完成读写操作的时间(以秒为单位)。 | 10 | single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | 60 | 使用名称-值对组参量在创建对象时设置此属性。也可在创建对象后更改。 |
Tag | 用于标识连接的标签。 | “” | string | “pSupply” | 自 R2024a 起,可用于标识连接,便于后续访问。 |
☘️☘️创建示例:
s = serialport('COM1',9600);
# 如果要设置上述属性,示例
s.DataBits = 7;
查看你创建的串口对象:
除了前面写的9个属性,还有2类:读写属性
和回调属性
。
🔹读写属性:
属性名称 | 描述 | 默认值 | 数据类型 | 示例 | 备注 |
---|---|---|---|---|---|
NumBytesAvailable | 可供读取的字节数,以数值形式返回。 | 无默认值 | double | 1024 | 此属性为只读。 |
NumBytesWritten | 写入串行端口的字节数,以数值形式返回。 | 0 | double | 512 | 此属性为只读。 |
Terminator | 用于读取和写入以 ASCII 字符结尾的数据的终止符字符。 | “LF” | char | string | 数字 (0 至 255) | “CR” | 可选值:“LF”、“CR”、“CR/LF” 或数字 0 至 255。如果读取终止符和写入终止符不同,则以 1×2 元胞数组形式返回。使用 configureTerminator 函数设置此属性。 |
🔹回调属性:
属性名称 | 描述 | 默认值 | 数据类型 | 示例 | 备注 |
---|---|---|---|---|---|
BytesAvailableFcnMode | 字节可用回调触发模式。 | “off” | char | string | “off” | 可选值:“off”、“byte”、“terminator”。使用 configureCallback 函数设置此属性。 |
BytesAvailableFcnCount | 触发回调的数据字节数。 | 64 | single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | 128 | 仅当 BytesAvailableFcnMode 属性为 “byte” 时,才使用此值。使用 configureCallback 函数设置此属性。 |
BytesAvailableFcn | 由字节可用事件触发的回调函数。 | 空 | function_handle | @myFcn | 使用 configureCallback 函数设置此属性。回调函数在接收到指定数量的字节或终止符时触发。 |
ErrorOccurredFcn | 由错误事件触发的回调函数。 | 空 | function_handle | @myErrFcn | 在发生异步读取或写入错误时触发。 |
UserData | 用户数据的通用属性。 | 空 | 任意 MATLAB 数据类型 | datetime() | 可用于存储回调函数触发时的数据。 |
2.2 串口对象的函数
函数名称 | 描述 | 用途 |
---|---|---|
read | 从串行端口读取数据。 | 读取二进制数据或数值数据。 |
readline | 从串行端口读取 ASCII 字符串数据行。 | 读取以终止符结尾的字符串。 |
write | 将数据写入串行端口。 | 写入二进制数据或数值数据。 |
writeline | 将 ASCII 数据行写入串行端口。 | 写入以终止符结尾的字符串。 |
serialbreak | 向连接到串行端口的设备发送中断信号。 | 用于发送中断信号以控制设备。 |
flush | 清空串行端口设备缓冲区。 | 清空接收或发送缓冲区。 |
configureTerminator | 为与串行端口的 ASCII 字符串通信设置终止符。 | 设置读取和写入操作的终止符。 |
configureCallback | 为与串行端口设备的通信设置回调函数和触发条件。 | 设置回调函数及其触发条件。 |
getpinstatus | 获取串行引脚状态。 | 获取 RTS、DTR 等引脚的状态。 |
setRTS | 设置串行 RTS 引脚。 | 设置 RTS 引脚的状态。 |
setDTR | 设置串行 DTR 引脚。 | 设置 DTR 引脚的状态。 |
delete | 删除句柄对象。 | 删除串行端口对象。 |
clear | 从工作区中删除项目、释放系统内存。 | 清除工作区中的变量。 |
2.21 读取
使用串口调试助手定时发送(每秒一次),使用matlab程序读取:
☘️(1) read()
函数:读取指定数量的指定类型的数据
data = read(device,count,datatype)
从串行端口连接 device 以 datatype 指定的格式读取 count 个值。对于所有数值 datatype 类型,data 是双精度值的行向量。对于 “char” 或 “string” 的文本类型 datatype,data 的值属于指定类型。该函数暂停 MATLAB® 的执行,直到读取了指定数目的值或发生超时。
☘️☘️(2)readline()
:取 ASCII 字符串数据行
data = readline(device)
从串行端口连接读取 ASCII 数据,直到第一次出现终止符,并以不带终止符的字符串形式返回 data。如果该函数无法在 device 的 Timeout 属性指定的时间段内返回任何数据,它将以 0×0 双精度 [] 形式返回 data。该函数暂停 MATLAB® 的执行,直到到达终止符或发生超时。
🟢 这个需要发送双方的终止符一致才能读取。终止符就是换行(LF:\n
)、回车(CR:\r
)、换行+回车(CRLF \r\n
)这三种。
终止符代表一行的结束。终止符肉眼不可见,但有对应的ASCII值。Windows 的文本编辑器会默认在一行的末尾添加CRLF,Linux则是LF。如matlab:
🗝️示例:使用串口调试助手定时发送数据,设置终止符为回车
。
matlab创建的串口对象终止符默认是:LF,现在是无法收到数据的。
需要手动配置终止符:
s = serialport('COM1',9600);
s.configureTerminator("CR")
data = readline(s)
现在就可以收到数据了:
注意:如果发送方的终止符是\r\n
,matlab串口对象的终止符设置为\r
或者\n
也可以读取到内容,包含了嘛,不过会有小问题,比如使用\n
,就会多读取一个换行符,比如这样:
data =
"hello matlab serial
"
2.22 写入
和读取是对应的。
(1)write()函数
:写入指定数量、指定类型数据
write(device,data,datatype)
将行向量或列向量 data 写入指定的串行端口连接 device。该函数以指定的数据类型 datatype 写入数据,而不考虑 data 中的格式。该函数暂停 MATLAB® 的执行,直到写入了指定的值。
☘️(2)writeline()
:写入一行
writeline(device,data)
将 ASCII 文本 data(后跟终止符)写入指定的串行端口。该函数暂停 MATLAB® 的执行,直到写入了数据和终止符。
终止符前面说过了,一样的。
2.23 回调:configureCallback
对于发送数据,通常是每次手动发送,或者程序条件成立时发送,这是主动行为。
但是读取确实被动的,你不知道对方什么时候会发送数据,所以要设置回调函数来进行读取,类似于中断的概念(单片机就是串口中断)。
语法:
configureCallback(device,"terminator",callbackFcn)
configureCallback(device,"byte",count,callbackFcn)
configureCallback(device,"off")
主要设置的有:回调的触发条件,以及触发后执行什么操作(回调函数)。
🟢(1)configureCallback(device,"terminator",callbackFcn) :
将回调函数 callbackFcn
设置为每当可从指定的串行端口读取终止符时
触发。
该语法将 device 的 BytesAvailableFcnMode 属性设置为 “terminator”,将 BytesAvailableFcn 属性设置为 callbackFcn。
🗝️示例:每次读取到终止符时,打印收到的内容:
clear
clc
s = serialport('COM1',9600);
configureCallback(s,"terminator",@mycallbackfunc)
function mycallbackfunc(s,~)
data = readline(s);
% 打印时间和收到的内容
fprintf("[%s] %s\n",string(datetime('now',Format='HH:mm:ss')),data);
end
输出:
🟢🟢注意: 回调函数的参数
函数至少需要2个参数:
- 串口对象:
- 事件对象:这是一个结构体,包含了与当前事件相关的额外信息。如果不要,可以像我上面那样写。
如果函数有超过2个参数: 通过匿名函数将额外的参数传递给回调函数。匿名函数可以捕获外部变量,并将它们作为参数传递给实际的回调函数。
clear
clc
s = serialport('COM1', 9600); % 创建串口对象
% 定义一个额外的参数
extraParam = "Hello from outside!";
% 使用匿名函数传递额外参数
configureCallback(s, "terminator", @(s, event) mycallbackfunc(s, event, extraParam));
% 回调函数定义
function mycallbackfunc(s, ~, extraParam)
try
data = readline(s); % 读取一行数据
disp(['Received data: ', data]); % 显示接收到的数据
disp(['Extra parameter: ', extraParam]); % 显示额外的参数
catch ME
disp('Error in callback function:');
disp(ME.message); % 显示错误信息
end
end
configureCallback(device,“byte”,count,callbackFcn):这个我就不讲了,类似的。
2.24 删除串口对象
前面使用回调:你会发现,程序运行完了,如果发送数据,还是能收到内容
只有串口对象失效后:回调函数才会失效。
使用以下方法使串口对象失效或删除。
☘️(1)使用delete
函数删除句柄对象
delete(H) 会删除句柄对象。调用 delete 后,H 成为无效对象(该对象已销毁)。如果 H 是句柄对象的数组,则 MATLAB® 对数组中的每个对象调用 delete 方法。
handle 类的子类可以实现名为 delete 的方法,以在销毁类的对象之前执行清理任务。当任何 handle 对象被销毁时,MATLAB 会自动调用该对象的 delete 方法。子类 delete 方法必须满足特定条件,才能在对象销毁过程中被 MATLAB 调用。有关对 handle 的子类实现 delete 方法的信息,请参阅句柄类析构函数。
☘️(2)clear
从工作区中删除项目、释放系统内存。
clear s
2.3 其它函数
2.31 列出已经打开的串口
例:
S = serialportfind
现在就可以删除这个对象,关闭连接。
>> S = serialportfind
S =
Serialport - 属性:
Port: "COM1"
BaudRate: 9600
Tag: ""
NumBytesAvailable: 0
Show all properties, functions
2.32 列出系统的串口
serialportlist
serialportlist("all")
serialportlist("available")
serialportlist 或 serialportlist(“all”) 返回系统上所有串行端口的列表。该列表包括由 USB 转串行设备和 Bluetooth® 串行端口配置文件设备提供的虚拟串行端口。该列表显示您可以在计算机上访问并可用于串行端口通信的所有串行端口。
serialportlist(“available”) 仅返回系统上当前可用的串行端口的列表。
其它的就简单了,比如和Proteus通信,和单片机通信等等。