MATLAB串口操作

本篇文章主要介绍MATLAB对串口的操作

串口操作的整个流程:

  1. 建立串口对象–使用serial创建函数对一个特定的串口创建对象(可能要配置一些属性,如波特率、数据位数等)
  2. 对设备进行连接–使用fopen函数来实现串口对象与设备的连接。
  3. 配置属性–使用set或者 . 符号来建立想要的串口对象的行为属性值,可以再创建对象时或者是建立对象以后都可以堆属性进行配置
  4. 发送和接收数据–发送数据是通过函数fprintf和fwrite来实现的,接收数据是通过fgetl,fgets,fread,fscanf和readasync来实现的,串口对象此时的行为都是基于前面的属性配置的
  5. 断开连接和清空—使用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)

创建串口对象

使用下列语句创建串口对象

扫描二维码关注公众号,回复: 13593889 查看本文章
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:发送到设备上总的字节数

输出缓存和数据流

输出缓存时分配给串口对象的计算机内存,用来存储要写入设备的数据。当输出数据写入设备时,数据流分为以下两步:

  1. 通过写函数将指定的数据发送到输出数据缓存区
  2. 输出缓存内的数据发送到设备

OutputBufferSize属性指定了要存放在输出缓冲中的数据的最大字节数
BytesToOutput属性表明了现存在output buffer中数据的字节数

如果超过了output buffer的大小限制,就不能写入数据,错误发生
在这里插入图片描述

写文字数据

fprintf函数用来把文字数据写入到设备中

用法:

fprintf(s,'send data')

在默认情况下fprintf函数是同步写入,并且阻碍命令行访问,直到执行完毕。要想异步写入设备,可以在fprintf的字符串中的最后位指定为async:

fprintf(s,'send data','async')

异步操作不会阻碍对MATLAB命令行的访问,并且,当一个异步写操作在进行时:

  1. 可以执行一个异步读操作,因为串口有不同的针脚来完成读和写
  2. 可以使用所有支持的回调属性

fprintf写操作在下面条件之一发生时,就完成:

  1. 数据写入完成
  2. Timeout属性指定的时间过了

写二进制数据

使用fwrite函数来写入二进制数据到设备中,写入二进制数据就是指写入数字值

在默认时,fwrite函数是同步操作。如果要使用异步,也需要在fwrite末尾部分添加async参数

读数据

读数据相关的函数:

fgetl:从设备中读取一行数据并丢弃终止符
fgets:从设备中读取一行数据并包括终止符
fread:从设备中读取二进制数据
fscanf:从设备中读取数据并格式化为文本
readasync:从设备中异步读取数据
stopasync:停止异步读和写操作

读数据相关的属性:

BytesAvailable:输入缓冲区中可用的字节数
InputBufferSize:输入缓冲区的大小,按字节算
ReadAsyncMode:指定异步读取操作为连续操作还是手动操作
Timeout:完成一个读写操作的等待时间
TransferStatus:异步读取或写入操作的状态
ValuesReceived:从设备中读取的值的总数量

输入缓存和数据流

输入缓存(Input Buffer)是串口对象分配的计算机内存,用来存储从设备读到的数据。当从设备读取数据时,数据流遵循以下两步:

  1. 从设备中读取的数据要存放到输入缓存中
  2. 输入缓存中的数据通过读操作函数将数据返回到MATLAB变量中

InputBufferSize属性指定了可以存放在输入缓存中的数据的最大字节数
BytesAvailable属性指定了存放在输入缓存中的,可以使用的数据的大小

在这里插入图片描述
对于读操作,并不知道从设备返回上来的数据的字节数。因此,需要在连接串口对象之前先给InputBufferSize属性配置一个足够大的值。

读文字数据

可以使用fgetl,fgets和fscanf函数来从设备上读取数据,并把数据按文字格式对待

在默认时,fscanf使用%c的格式来读取数据,因为许多串口设备返回的数据是基于文字格式的

可以用ValuesReceived属性来查看读到了多大的数据

同步和异步读操作:通过ReadAsyncMode属性,可以指定读操作采用同步或异步的方式。ReadAsyncMode属性值有continuous和manual。如果ReadAsyncMode是continuous(默认),串口对象连续查询设备,看数据是否可读。如果数据可用,就被异步地输入到缓存中。要把输入缓存中的数据送到MATLAB中,用同步(阻塞)读函数来操作(fgetl或fscanf)。如果数据在输入缓存中可用,这些函数就可以将输入缓存中的值返回。如果ReadAsyncMode的值为manual,串口对象不连续查询设备。要异步读取数据,使用readasync函数。要把输入缓存中的数据送到MATLAB中,使用读函数来操作。

异步操作不阻塞命令行,在异步读取数据时,可以:

  1. 执行一个异步写操作,因为串口有不同的针脚来完成读和写
  2. 可以使用所有支持的回调属性

fscanf函数操作完成的规则:一个fscanf函数在读操作是将要阻塞对MATLAB命令行访问,直到:

  • 使用Terminator属性指定的停止字
  • Timeout属性指定的超时时间到
  • 达到了指定的读取数据的个数
  • 输入缓存满了

读二进制数据

用fread函数来从设备读入二进制数据,这就代表这将传递数值给MATLAB

如果使用的是fgetl,fgets或fscanf函数,需要调用两次,因为每个值的后面都跟随了一个停止字,输入缓存中有两个停止字。如果使用了fread,只需要调用一次就可以把所有数据读取MATLAB中

断开连接

当不再使用串口对象时,要断开它和设备的连接,清空内存(delete(s)),并移除工作区(clear s)

fclose(s)
delete(s)
clear s

猜你喜欢

转载自blog.csdn.net/Xiao_Jie123/article/details/119061778