在MATLAB App Designer中,我们可以通过一些组件结合M语言,实现PC端与单片机串口通信,单片机选用STM32F103.首先需要先让单片机通过串口发送数据,以供我们上位机读取处理,在本文就不介绍如何实现STM32串口发送数据,仅介绍上位机端如何实现接收STM32发来的串口数据。

首先展示我完成的简易版的上位机软件工程界面(见图2.1)。可以看到该上位机由串口通信、监控界面、实时绘图、数据读取与存储、外部数据代入生成表格以及生成图像等功能组成。本章仅展示串口通信的实现,其余部分见其它文章,在后续会继续推送。

 图2.1 BMS简易上位机

 首先,实现串口通信,我们就要明白串口通信是什么:

串口通信是一种常见的数据传输方式,它通过串行传输数据位来实现数据的发送和接收。在STM32中,串口通信可以通过USART或UART接口来实现。这些接口提供了多种配置选项,例如波特率、数据位数、校验位和停止位等,以满足不同应用场景的需求。

串口通信的基本流程如下:

配置串口参数:包括波特率、数据位数、校验位和停止位等。

初始化串口:使能USART或UART接口,并设置相关的中断使能和接收缓冲区等。

发送数据:将需要发送的数据填充到发送缓冲区中,并触发发送中断或轮询方式发送。

接收数据:将接收到的数据从接收缓冲区中读取出来,并进行处理。

需要注意的是,在进行串口通信时,发送方和接收方的串口参数必须保持一致,否则会出现数据传输错误的情况。

可以看到串口通信涉及到多种参数的配置,在上位机中,我们主要要做的是与STM32串口进行通信,所以我们要确定连接的串口、波特率大小、校验位和停止位大小等参数。确定连接的串口,是为了确定我们所连接的目标对象,波特率大小是确定我们上位机和STM32单片机进行通讯的速度,该速度必须与STM32内部串口配置的一致,否则会出现通信失败或者数据异常等情况,校验位和停止位也是参考STM32内部配置情况,以确保我们接收的数据正常。在我设计的上位机中未用到校验位和停止位校验,如果需要的话可以进行配置。

那么开始搭建串口通信模块(图2.2),实现流程如下:             

 图2.2 串口通信模块

该串口通信模块分别应用到下图几个模块组件(见图2.3)。

 图2.3 模块组件

 图中的模块组件,可以通过观察图2.2自行模仿搭建。组件设置的时候主要注意要将COM下拉框属性中的Items值清空,将波特率下拉框的Items值设置为9600和115200(该处设置这两个值是因为波特率值一般设置为这两个,同时为了我们可以选择目标波特率时,则以从该处选择波特率数值),value值设置为9600(相当于将默认值设置为9600),以及将开关属性中的ItmesData的值设置为0,1,以分别对应off和on。其余的基本是格式问题,自行注意即可。通过上述讲解后,基本可以完成该模块的外观设计部分,下面转入代码实现,以实现我们具体的通信功能。

 首先,我们可以从图中可以看到,有一个串口搜索Button,还有COM选项。我期望通过点击一下串口Button,便可将当前电脑连接的端口显示出来,然后从这些端口中获得我们想要的端口对象,即STM32与上位机连接的端口。实现方法如下:

 ①串口搜索Button增添一个回调函数,该函数添加位置在其属性栏中。增加成功后会跳到该函数的代码设计部分(如图2.4所示),随后我们就开始编辑代码。由于按钮按下去的变化只会产生两个值,第一次为1,第二次为0,每次按键值为1时,都会触发回调函数,那么只要捕捉按键值为1时的这个行为,触发一些功能即可。

图2.4按键回调函数

②搜索端口,我们可以使用MATLAB自带的函数serialportlist("available");

serialportlist 或 serialportlist("all") 返回系统上所有串行端口的列表。该列表包括由 USB 转串行设备和Bluetooth® 串行端口配置文件设备提供的虚拟串行端口。该列表显示您可以在计算机上访问并可用于串行端口通信的所有串行端口。

serialportlist("available") 仅返回系统上当前可用的串行端口的列表。

那我们在实际编码中,可使用函数serialportlist("available") 获取当前系统上当前可用的串行端口列表,属性选择为"available",具体属性参数参考MATLAB帮助文档。我们可以定义一个函数,方便我们直接调用到回调函数中,构建的功能函数如下:

function Serial_COMX(app)

app.serial_COMx=serialportlist("available");

app.Serial_COM_Sel.Items=app.serial_COMx;

end

通过该函数我们便可以搜索到当前可用的串口端口以及将搜索到的串口列表添加到组件COM中,借此可以选中我们所需要的串口端口,然后将该函数与串口搜索函数相配合,即可实现按键按下时触发串口搜索函数,并显示在COM组件中。代码实现如下:

function ButtonValueChanged(app, event)

value = app.Button.Value;

if value==1

Serial_COMX(app);

end

③根据上述操作,我们获得了串口端口的连接通道,随后就是配置波特率。我们在构建该串口通信模块时,已经在设计视图中构建了波特率9600和115200可选项,只要我们在运行App时,选中我们所需的波特率,再结合代码获取组件当前选中的值(即当前选中的波特率),即可配置好波特率。同时在完成波特率配置后,我们便可以使用fopen函数连接串口端口与STM32进行通信。

function configureSerialPort(app)

app.Serialport=serialport(app.Serial_COM_Sel.Value,str2double(app.Serial_Buad_Sel.Value));

fopen(app.Serialport);

end

④在该模块中,我设计了一个串口通信开关和指示灯,我期望打开开关的时候即可实现通信连接,且指示灯亮,表示通讯正常,那么功能实现如下:由于函数function configureSerialPort(app)是一个公共函数,我们需要一个给开关建立一个回调函数去调用function configureSerialPort(app)。

function Serial_SwitchValueChanged(app, event)

value = app.Serial_Switch.Value;

switch value

case 1

configureSerialPort(app);

app.Serial_LED.Color="g";

case 0

timer_stop(app);

app.Serial_LED_State.Color=[0.65,0.65,0.65];

stopasync(app.Serialport);

delete( app.Serialport);

end

该函数实现按需连接串口,指示灯监控通信状态,开关关闭后,删除连接的串口端口,便于下次直接热启动。

随后则是接收串口数据,接收串口数据我们可以运用函数read,并配置其连接的串口、数据量、数据格式。具体参考可见下面代码:

app.receivedData=read(app.Serialport,278,"string");

随后我们需要将接收到的数据进行显示,我们可以运用文本组件,并将获得的数据赋予该组件的属性Value中即可,具体的代码实现,在上述讲解的基础上大家可自行尝试。

本节内容到此结束,如果对您有帮助的话,可以三连哈哈哈,后续继续更新数据通信与时钟的内容,直至讲解整个简易版的BMS上位机软件,谢谢大家支持!

参考链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: