本篇文章主要介绍MATLAB对串口的操作
文章目录
串口操作的整个流程:
- 建立串口对象–使用serial创建函数对一个特定的串口创建对象(可能要配置一些属性,如波特率、数据位数等)
- 对设备进行连接–使用fopen函数来实现串口对象与设备的连接。
- 配置属性–使用set或者 . 符号来建立想要的串口对象的行为属性值,可以再创建对象时或者是建立对象以后都可以堆属性进行配置
- 发送和接收数据–发送数据是通过函数fprintf和fwrite来实现的,接收数据是通过fgetl,fgets,fread,fscanf和readasync来实现的,串口对象此时的行为都是基于前面的属性配置的
- 断开连接和清空—使用fclose使串口断开连接,清空内存用delete函数,从MATLAB工作区删除,使用clear命令
配置和返回属性值
通过set函数和 . 符号来对属性值进行配置,使用get函数来获得属性值
首先通过
s=serial(‘端口号’) 例如:s=serial('COM1')
来创建一个串口对象
返回属性的值
通过get(s)来获取当前对象的串口属性值
get(s)
ByteOrder = littleEndian
BytesAvailable = 0
BytesAvailableFcn =
BytesAvailableFcnCount = 48
BytesAvailableFcnMode = terminator
BytesToOutput = 0
ErrorFcn =
InputBufferSize = 512
Name = Serial-COM1
ObjectVisibility = on
OutputBufferSize = 512
OutputEmptyFcn =
RecordDetail = compact
RecordMode = overwrite
RecordName = record.txt
RecordStatus = off
Status = closed
Tag =
Timeout = 10
TimerFcn =
TimerPeriod = 1
TransferStatus = idle
Type = serial
UserData = []
ValuesReceived = 0
ValuesSent = 0
SERIAL specific properties:
BaudRate = 9600
BreakInterruptFcn =
DataBits = 8
DataTerminalReady = on
FlowControl = none
Parity = none
PinStatus = [1x1 struct]
PinStatusFcn =
Port = COM1
ReadAsyncMode = continuous
RequestToSend = on
StopBits = 1
Terminator = LF
获取单个属性的值,要把属性的名字提供给get函数:
get(s,'Outputbuffersize')
ans =
512
获取多个属性的值
get(s,{'Parity','Transferstatus'})
ans =
1×2 cell array
'none' 'idle'
设置属性的值
通过使用set函数来设置属性的值:
set(s,'BaudRate',115200)
通过使用 . 符号来设置属性的值:
s.BaudRate = 115200
通过使用set函数来
set(s,'BaudRate',115200,'Inputbuffersize',1024)
创建串口对象
使用下列语句创建串口对象
s = serial('端口号')
如果端口号在使用中,或者不存在,则不能将端口号对应的设备连接到电脑上
也可以在创建对象的时候,配置对象的属性值
s = serial('port','BaudRate','9600','Parity','even')
如果分配了非法的属性名,这个对象不会被创建。如果分配了非法的值给某个属性,那么这个对象将会被创建,但是在使用fopen进行连接时,将会出现问题
连接设备
在开始使用串口对象来写和读数据之前,必须要使用serial函数中分配的串口来连接到设备。
使用fopen函数来创建对象
fopen(s)
串口属性在连接后就不能进行修改了,必须要使用fopen函数来连接之前就设置好
可以通过检查Status来确认这个串口对象是不是连接在设备上:
s.Status
ans =
'open'
如下图所示,在设备和串口对象连接时,数据是可以被读写的:
配置通讯参数
在使用串口读写数据之前,串口对象和设备必须要有一致的通信设置。配置串口通信包含控制波特率和串口数据格式的一些特殊的属性值:
BaudRate:波特率
DataBits:数据位数
Parity:奇偶校验位
StopBits:停止位
Terminator:终结字符
读写数据
对MATLAB命令行的访问控制
通过指定读写操作是同步的还是异步的,可以控制对MATLAB命令行的访问。
如果是同步操作,就会阻碍对MATLAB命令行的访问,直到写数据操作完成。异步操作的不会阻碍命令行,在读写函数的执行过程中,可以执行附加的命令
由于串口有不同的读写引脚,因此可以同时读写数据,如下图所示
写数据
写数据涉及到的函数:
fprintf:写文字到设备
fwrite:写数据到设备
stopasync:停止异步读写操作
写数据所涉及的属性:
ByteToOutput:当前数据缓存中的字节数
OutputBufferSize:输出缓存的大小(按字节算)
Timeout:完成一个读写操作的等待时间
TransferStatus:异步读取或写入操作的状态
ValuesSent:发送到设备上总的字节数
输出缓存和数据流
输出缓存时分配给串口对象的计算机内存,用来存储要写入设备的数据。当输出数据写入设备时,数据流分为以下两步:
- 通过写函数将指定的数据发送到输出数据缓存区
- 输出缓存内的数据发送到设备
OutputBufferSize属性指定了要存放在输出缓冲中的数据的最大字节数
BytesToOutput属性表明了现存在output buffer中数据的字节数
如果超过了output buffer的大小限制,就不能写入数据,错误发生
写文字数据
fprintf函数用来把文字数据写入到设备中
用法:
fprintf(s,'send data')
在默认情况下fprintf函数是同步写入,并且阻碍命令行访问,直到执行完毕。要想异步写入设备,可以在fprintf的字符串中的最后位指定为async:
fprintf(s,'send data','async')
异步操作不会阻碍对MATLAB命令行的访问,并且,当一个异步写操作在进行时:
- 可以执行一个异步读操作,因为串口有不同的针脚来完成读和写
- 可以使用所有支持的回调属性
fprintf写操作在下面条件之一发生时,就完成:
- 数据写入完成
- Timeout属性指定的时间过了
写二进制数据
使用fwrite函数来写入二进制数据到设备中,写入二进制数据就是指写入数字值
在默认时,fwrite函数是同步操作。如果要使用异步,也需要在fwrite末尾部分添加async参数
读数据
读数据相关的函数:
fgetl:从设备中读取一行数据并丢弃终止符
fgets:从设备中读取一行数据并包括终止符
fread:从设备中读取二进制数据
fscanf:从设备中读取数据并格式化为文本
readasync:从设备中异步读取数据
stopasync:停止异步读和写操作
读数据相关的属性:
BytesAvailable:输入缓冲区中可用的字节数
InputBufferSize:输入缓冲区的大小,按字节算
ReadAsyncMode:指定异步读取操作为连续操作还是手动操作
Timeout:完成一个读写操作的等待时间
TransferStatus:异步读取或写入操作的状态
ValuesReceived:从设备中读取的值的总数量
输入缓存和数据流
输入缓存(Input Buffer)是串口对象分配的计算机内存,用来存储从设备读到的数据。当从设备读取数据时,数据流遵循以下两步:
- 从设备中读取的数据要存放到输入缓存中
- 输入缓存中的数据通过读操作函数将数据返回到MATLAB变量中
InputBufferSize属性指定了可以存放在输入缓存中的数据的最大字节数
BytesAvailable属性指定了存放在输入缓存中的,可以使用的数据的大小
对于读操作,并不知道从设备返回上来的数据的字节数。因此,需要在连接串口对象之前先给InputBufferSize属性配置一个足够大的值。
读文字数据
可以使用fgetl,fgets和fscanf函数来从设备上读取数据,并把数据按文字格式对待
在默认时,fscanf使用%c的格式来读取数据,因为许多串口设备返回的数据是基于文字格式的
可以用ValuesReceived属性来查看读到了多大的数据
同步和异步读操作:通过ReadAsyncMode属性,可以指定读操作采用同步或异步的方式。ReadAsyncMode属性值有continuous和manual。如果ReadAsyncMode是continuous(默认),串口对象连续查询设备,看数据是否可读。如果数据可用,就被异步地输入到缓存中。要把输入缓存中的数据送到MATLAB中,用同步(阻塞)读函数来操作(fgetl或fscanf)。如果数据在输入缓存中可用,这些函数就可以将输入缓存中的值返回。如果ReadAsyncMode的值为manual,串口对象不连续查询设备。要异步读取数据,使用readasync函数。要把输入缓存中的数据送到MATLAB中,使用读函数来操作。
异步操作不阻塞命令行,在异步读取数据时,可以:
- 执行一个异步写操作,因为串口有不同的针脚来完成读和写
- 可以使用所有支持的回调属性
fscanf函数操作完成的规则:一个fscanf函数在读操作是将要阻塞对MATLAB命令行访问,直到:
- 使用Terminator属性指定的停止字
- Timeout属性指定的超时时间到
- 达到了指定的读取数据的个数
- 输入缓存满了
读二进制数据
用fread函数来从设备读入二进制数据,这就代表这将传递数值给MATLAB
如果使用的是fgetl,fgets或fscanf函数,需要调用两次,因为每个值的后面都跟随了一个停止字,输入缓存中有两个停止字。如果使用了fread,只需要调用一次就可以把所有数据读取MATLAB中
断开连接
当不再使用串口对象时,要断开它和设备的连接,清空内存(delete(s)),并移除工作区(clear s)
fclose(s)
delete(s)
clear s