STM32
直播中

张昂笙

7年用户 964经验值
私信 关注
[问答]

STM32与matlab串口是如何进行通信的

怎样去使用matlab serial函数呢?
STM32与matlab串口是如何进行通信的?

回帖(1)

刘华

2021-11-18 11:33:53
  matlab串口接收数据学习——与STM32通信
  虽然可以把所有算法代码集成到STM32中运行,但最终还是希望能够获得运算结果和中间过程的一些数据集,当然日后也希望能够在STM32于matlab的通信中实现更多的交互功能以达到更可视化和自由化的控制。我用的是STM32F103ZET6芯片,matalb安装的是2019b版本。
  1. matlab serial函数的解释与运用
  matlab真的相当强大,都有专门的串口函数serial。我们首先看最基本的语法:
  s = serial(‘port’, Name,Value)
  port指的是串口数目,后两者主要指要指定的参数和具体设置的参数值。matlab一共有12个串口可以供我们调试使用,我们可以通过instrfindall查看现在被连接的串口信息,所以也意味着在每次进行串口操作前,最好加入delete(instrfindall)语句保证所有的串口关闭以进一步操作,否则有时会出现串口打开错误等提示。
  在开始操作前,我们可以通过seriallist 函数查找可以被连接的串口,说白了就是STM32完成串口硬件连接后,连到了哪个串口。那么下面开始具体的设置:
  s = serial(‘COM7’);
  这一步定义了一个串口信息,接下来可以用set函数等对它进行操作,当然我更喜欢在一开始做好很多绝对不会变的参数:
  t=seriallist; ming=serial(t,‘BaudRate’,115200,‘Terminator’,‘CR’);
  我们可以看到串口的基本信息:
  
  到这时其实串口就可以使用了,当然我们可以一起看看各种参数的使用,以进行多方面的开发,当然相信波特率大家都知道就不再多说:
  %%通信属性
  ming.ByteOrder = ‘bigEndian’ %是指设备的字节顺序,比如说十六进制数(一般我用USART_Sendata来发送),比如发送4A23,这是两个字节,因此可以通过这个参数来设定两个字节的存储顺序
  ming.DataBits = 8;%数据位数的定义,当然一般八位没啥毛病
  ming.Parity = ‘even’%表示奇偶校验位,我一般不设置用他的默认值
  ming.StopBits = 1;%停止位,这个我也使用的是默认值一般不进行额外设置
  s.Terminator = ‘CR’;终止符,CR答辩回车,LF代表换行。
  这些都是一些基本的通信基础,而对于数据流的有效控制则还需要进一步对读取和写入属性进行学习:
  ming.Status %表示串口的状态,返回closed 或 open
  %%读取属性
  ming.BytesAvailable%指的是输入缓冲区可用字节数,一般也不需要设置
  ming.InputBufferSize = 768%输入缓冲区的大小,单位是字节,fgetl、fget 或 fscanf 函数读取文本数据。您可以使用 fread 函数读取二进制数据。
  %%写入属性
  ming.BytesToOutput%输入缓冲区的字节数
  ming.OutputBufferSize = 256;%输出缓冲区的大小。
  当然回来的数据要进行记录,因此还需要知道记录属性
  ming.RecordName = ‘MyRecord.txt’;
  ming.RecordMode = ‘index’;
  record(ming)%开启记录
  record(ming,‘off’)%关闭记录
  fopen(ming);fclose(ming);delete(ming);clear ming%这个相信不用过多解释吧
  另外还有很多相关参数,由于本项目用不到其他例如中断啊或者控制引脚的相关信息,因此便不再赘述。
  2. 相关代码例程
  我只需要进行读数据,因此相对而言简单一些:
  clear;
  clc;
  delete(instrfindall);
  t=seriallist;
  ming=serial(t);
  set(ming,‘BaudRate’,115200,‘DataBits’,8);
  ming.BytesAvailableFcnMode =‘byte’;
  ming.Parity=‘none’;
  ming.InputBufferSize=1024; % 输入缓存
  fopen(ming);% 将串口对象打开
  out=fread(ming,1);
  fclose(ming);
  delete(ming);
  clear ming
举报

更多回帖

发帖
×
20
完善资料,
赚取积分