一种基于单片机的蓝牙医疗设备网关的软件设计

2022-06-24 07:38祝小蜜温琦霖
电子制作 2022年10期
关键词:串口网关中断

祝小蜜,温琦霖

(广州商学院,广东广州,511363)

0 引言

近年来,我国老龄化越来越严重,高血压、糖尿病等慢性疾病越来越多,再加上现在不健康的饮食和生活方式使得各种疾病越来越常见。远程的家庭医生在社会上需求越来越大。同时,现在市场上出现了一些常见的家庭用的蓝牙医疗设备,如血压计、血糖仪、电子听诊器等。基于远程家庭医生的构想,可以做一套基于现有设备的远程家庭医生系统。常见的蓝牙设备网关都采用带系统的嵌入式,软件开发难度相对较大,本文设计并实现了一种基于单片机的蓝牙网关的软件,设计不需要考虑蓝牙协议、WIFI协议和4G通信协议的底层,可以快速的构建蓝牙数据到云端的通信,将这些常用的蓝牙医疗设备的数据上传至云服务器,为实现远程医疗打通了设备到云端的数据通信路径。

蓝牙网关的作用示意图如图1所示。

图1 蓝牙网关作用示意图

1 硬件平台

本设计的网关功能是实现与四台蓝牙医疗设备的蓝牙自动连接和数据传输,实现网关通过WIFI模块或4G模块与云服务器双向通信。另外考虑到可推广性和可用性,设计WIFI账户和密码、服务器IP和端口号等信息的修改功能,和设备连接状态的指示等,这部分功能用按键和显示屏实现。同时设计掉电记忆功能,用于掉电保存每个用户修改后的WIFI的名称、密码和服务器的IP地址、端口号,保证本设计的网关修改过上述信息后,掉电再开机时,网关能连接上WIFI和服务器。

本设计的硬件框图如图2所示。其中主控单片机型号是STM32F103RCT6,串口扩展电路使用WK2114芯片,蓝牙模块1、2、3使用低功耗蓝牙模块HLK-B40,用于连接血糖仪和两个血压仪蓝牙,模块4使用经典蓝牙模块HC-05,用于连接听诊器,WIFI模块使用ESP-12E,4G模块使用银尔达公司生产的Core-Air724 AT固件版本,按键使用三个普通的独立按键,显示屏使用常见的1.44寸IIC总线的TFT-LCD显示屏,掉电记忆使用EEPROM,型号是AT24C02 。

图2 硬件平台系统框图

2 软件设计

■ 2.1 软件整体功能设计

整个软件功能是首先进行初始化,使网关能够同时与4个蓝牙模块和WIFI模块或4G模块建立通信并使WIFI模块或4G模块能连接到服务器。初始化时要从AT24C02中读取待联网的WIFI的名称、密码和服务器的IP地址、端口号。初始化后网关处于空闲状态下,该状态网关服务器发送心跳包,服务器会回复心跳。当服务器下发上传数据的命令时,网关退出空闲状态,此时如果对应的蓝牙设备有数据产生则给服务器上传数据,每0.5秒上传一次数据包,每次上传后服务器都会发送确认数据包。当服务器发送停止上传命令时,网关再次进入空闲状态。空闲状态下即使接收到蓝牙设备发送的数据,也不会将数据上传到服务器。当网关在3秒内收不到服务器的心跳或确认信号,或者初始化阶段WIFI模块不能联网,则认为当前WIFI模块与服务器之间的连接中断,此时启动4G模块初始化,使4G模块替代WIFI模块与服务器之间建立连接并继续实现数据上传。如果4G模块断网了,则提醒用户联网失败请重启。另外显示屏上可实时查看与蓝牙设备以及服务器的连接状态,通过按键可以进入修改界面,并修改WIFI账户和密码以及服务器的IP地址和端口号,并将修改后的值在AT24C02中保存起来。

软件整体分为初始化、用户交互、与服务器之间的心跳和命令处理、数据上传和利用外部中断接收蓝牙数据等几个模块,其中用户交互包括按键检测和处理、连接状态检测和显示。

注意,本文对于STM32单片机的外设的使用、按键、显示、IIC时序、EEPROM使用等常用的设计不展开说明,主要说明几个模块的配置过程以及整体代码的逻辑设计。

图3 整体软件框架和流程

■ 2.2 初始化设计

初始化分为两个部分,一部分是单片机本身的外设的初始化,包括对IO口,串口,定时器,外部中断的初始化;另一部分是指对功能模块的初始化,目的是做好底层调用函数和使相应的模块能正常工作,包括显示屏和EEPROM用的IIC总线,WK2114串口扩展芯片的使用,各个蓝牙模块、WIFI模块、4G模块的AT指令配置等。

2.2.1 单片机外设初始化

单片机本身外设的初始化具体步骤不展开说明,只说明设置时要考虑的参数。对于定时器来说,系统用到了0.5秒计时、5秒计时等多个计时,对于多个计时,并不需要很多个定时器,只需要取所有计时的最大公约数的时间作为定时器中断时间,同时记录进中断次数,然后可以用进中断次数来判断多个计时时间是否达到。所以定时器中断周期设置为0.5秒,中断次数10次即为5秒。串口初始化的目的是建立单片机与各个模块之间的串口通信,之后才能设置模块的功能并接收数据。本系统一共使用了单片机的三个串口,分别连接扩展芯片的主串口、WIFI模块和4G模块的串口。考虑到数据传输速度至少要满足电子听诊器12KB/s的传输速度,结合三种串口模块能达到的串口最大速度,这三个串口的速度都设置为460800,这样既能满足设计需要,又不至于速度太高引起传输出错率增加。外部中断是为了从WK2114上读取蓝牙设备传来的数据。为了不丢失数据,读取数据需要尽快反应,所以使用中断的方式从WK2114的FIFO中读数据,并把该中断优先级设置为最高。

2.2.2 串口扩展芯片初始化

WK2114串口扩展芯片初始化时先拉低RST引脚10ms,实现对WK2114串口扩展芯片的复位,然后再拉高进入到工作状态。然后进行主串口波特率的自动匹配,方法是给主串口发送匹配码0x55,WK2114 可以自动测得此时MCU的波特率并把主接口UART的波特率锁定,以后就以此波特率进行通信;如果主接口需要再次更换波特率,需要对芯片硬件复位,然后再次进行波特率测试和锁定。匹配成功后,对每个子串口进行初始化,包括使能子串口的时钟、软件复位子串口、使能子串口总中断、使能子串口接收触点中断和超时中断、初始化FIFO和设置固定中断触点、使能子串口的发送和接收使能,设置子串口波特率等。本设计使用外部中断来处理各个子串口之间的数据接收。

使能了WK2112的子串口中断来读取FIFO中的数据,每个子串口的中断方式都设置为64触点中断和超时中断,即当任意一个子串口的FIFO中有64个字节数据或者在接收数据过程中有连续4个字节的时间内没有收到数据,则触发中断。

为了保证子串口同时收到的数据都能被主串口及时读出,那么主串口的传输速度要大于所有子串口的数据接收速度之和。本设计只有经典蓝牙模块产生的数据速度快,要预留大于16KB/是的速度,所以对应经典蓝牙模块的子串口波特率设置为460800,其他三个蓝牙产生数据的速度要小很多,所以另外三个子串口波特率设置为115200。

2.2.3 经典蓝牙模块初始化

首先让模块的复位引脚在高电平状态下,连续拉低两次50ms,让蓝牙模块进入到AT指令模式。然后通过以下AT指令和步骤进行配置:

AT+UART=460800,0,0:修改模块的串口波特率;

AT+ROLE=1:设置为主机模式;

AT+BIND=蓝牙地址:绑定蓝牙地址NAP:UAP:LAP(十六进制)绑定指令只有在指定蓝牙地址连接模式时有效;

AT+LINK =蓝牙地址:连接从机的配对地址;

AT+RESET:重启模块。

之后将蓝牙RST引脚拉低,将保存这些AT指令配置并将进入到运行模式。

2.2.4 低功耗蓝牙模块初始化

当MCU每次复位时,通过对蓝牙模块复位引脚的重新配置,复位引脚在高电平状态下拉低电平一秒钟,让蓝牙模块进入到AT指令模式。然后通过以下AT指令和步骤进行配置:

AT+BAND=115200:修改模块的串口波特率;

AT+UUIDS=0000FFF000001000800000805F9B34 FB:蓝牙模块透传服务默认值UUIDS;

AT+UUIDR=0000FFF400001000800000805F9B34 FB:透传服务中的Read特征默认值UUIDR;

AT+UUIDW=0000FFF100001000800000805F9B34 FB:透传服务中的Write特征默认值UUIDW;

AT+ROLE=2:设置为主机模式;

AT+PINCODE=000000:设置配对码;

AT+PEERMAC=蓝牙的MAC地址:连接从机的配对地址;

AT+REBOOT=1:重启模块。

之后模块将按照这些AT指令的配置并进入到运行模式。

2.2.5 WiFi模块初始化

WiFi模块的初始化通过对复位引脚进行拉低250ms后拉高,实现WiFi模块的复位,进入到AT指令模式。然后通过以下AT指令和步骤进行配置:

AT+CWMODE=3:模块设置为softAP + station 模式;

AT+RST:重启设备;

AT+UART_DEF=115200,8,1,0,1:设置串口波特率,并开启串口流控制;

AT+CWJAP_CUR="WiFi名称","WiFi密码":配置模块连接的WiFi名称和密码;

AT+CIFSR:查询本地的IP地址;

AT+CIPMUX=0:设置多连接模式;

AT+CIPMODE=1:设置传输模式为透传模式,仅支持TCP单连接情况;

AT+CIPSTART="TCP","IP地址",端口号:建立TCP连接;

AT+CIPSEND:在透传模式时,开始发送数据。

当WiFi连接网络失败时,会启动4G模块的初始化,保证设备的联网成功。

2.2.6 4G模块初始化

复位引脚在低电平状态下进行拉高1100ms后再拉低,完成4G模块的复位,当复位完成时,会接收到模块发送的“SMS READY”,表示复位完成。然后通过以下AT指令和步骤进行配置:

AT+CPIN?:查询卡是否插好,直到接收到回应,否则尝试重启模块;

AT+CSQ:查询卡的信息质量;

AT+CREG?:网络注册状态;

AT+CGATT?:附着GPRS网络;

AT+CIPMODE=1:设置为透传模式;

AT+CIPMUX=0:IP设置为单链接模式;

AT+CSTT="CMNET","","":选择卡的类型APN,这里使用的是中国移动;

AT+CIICR:激活后获取IP地址;

AT+CIFSR:查询IP地址;

AT+CIPSCONT:保存TCP的IP地址参数;

AT+CIPSTART="TCP","IP地址",端口号:创建TCP连接。

以上每个步骤单片机都要收到对应的回复才会进行下一步。当接收到服务器下发的”CONNECT”,表示连接服务器完成。当4G初始化失败时,显示屏上提示连接不成功请重启。

■ 2.3 用户交互设计

用户交互包括显示屏和按键。显示屏有两个显示界面,一个界面是显示网关与蓝牙以及与服务器之间的连接状态,与各蓝牙模块的连接状态由蓝牙模块的状态输出引脚的状态判断,与服务器之间的连接状态由是否收到服务器的心跳信号或数据接收信号判断;另一个界面显示修改WIFI用户名和密码以及服务器IP地址和端口号的过程。

用户输入使用了三个独立按键,分别是KEY1、KEY2、KEY3。KEY1用于进入修改状态和切换修改的位数。设定家庭WIFI的用户名和密码都是8位的数字和小写字母,而服务器的IP地址最大是255.255.255.255共12位数字,端口号最大是65535共5位数字,则总共需要修改的数字和字母位数是33位。系统正常工作时是显示网关连接状态的界面,当按键KEY1第一次按下时画面切换到信息修改界面,并处于第一个字符待修改的状态,界面上该位显示为红色,其他位置显示为蓝色,之后每次按下KEY1时,待修改位都会切换到下一个并显红色,一直到第33个位置之后再按下一次就推出修改界面,回到连接状态显示界面,并且把修改之后的字符存入到EEPROM中。KEY2、KEY3用于待修改位的字符的加减,字符在0-9和a到z之间循环。

■ 2.4 定时器逻辑设计

定时器初始化时设置为每0.5秒中断一次,用于提供0.5秒的时基和5秒、100秒、200秒的计时,其中0.5秒用于区分为阶段1和阶段2,两个阶段交替的处理数据;5秒计时用于空闲状态时每个5秒发送一次心跳包;100秒用于开始WIFI模块初始化的计时,如果WIFI在100秒内初始化成功,就不再计这个时间了,如果计时超过100秒就认为WIFI模块联网初始化不成功,这时要开启4G模块的初始化;200秒用于整个初始化阶段的计时,如果超过这个时间还没有初始化成功,则认为本网关连接不上网络,在显示屏上提醒用户重启本网关,如果初始化成功了,就会退出初始化状态,也就不再计时了。本文的流程图都比较长,用伪代码表达程序逻辑效果更好。定时器中断服务函数的逻辑设计用伪代码表示如下所示。

■ 2.5 与服务器之间的心跳和命令处理

本网关根据服务器下发的命令处于空闲和非空闲两种状态,空闲状态不会上传蓝牙模块收到的数据,只上传心跳包,非空闲状态时,如果蓝牙设备有数据发送过来,就把数据上传给服务器。系统上电默认为空闲状态,此时每隔5秒给服务器发送心跳包。空闲状态下如果收到开始上传的命令,则系统进入非空闲状态,非空闲状态下,如果收到停止上传的命令,则进入空闲状态。

不管在任何状态下,任何数据包在网关和服务器的通信都是要回发确认数据包的。如果网关发出任何数据的3秒内收不到正确的服务器回发数据,则认为网关和服务器之间断开连接了,此时如果是使用WIFI模块跟服务器通信,则需要启动4G模块的初始化,使4G模块替代WIFI模块与服务器之间建立连接并继续实现数据上传,如果是使用4G模块在通信,则提示用户联网失败,请重启。

单片机计时都是使用的定时器,关于计时的逻辑是和定时器中断函数一起实现的。与WIFI或4G模块之间传输数据使用各自连接的串口。服务器下发的心跳回复、命令、接收数据回复都是固定长度为31的数据字节,只是其中的有效字节不同。判断是否收到正确的回复,通过串口接收中断是否接收到31个的字节的数据且有效字节匹配。程序流程如下所示。

■ 2.6 蓝牙设备数据的接收

本设计采用WK2114串口拓展芯片,实现将一路异步串口拓展为 4 路 UART,用于连接四个蓝牙模块。WK2114是UART接口的4 通道 UART 器件,WK2114将一个标准异步串口扩展成为4个增强功能串口。

扩展的子通道的UART具备如下功能特点:每个子通道UART的波特率、字长、校验格式可以独立设置,最高可以提供2Mbps 的通信速率,每个子通道具备收、发独立的256 级FIFO,FIFO的中断可按用户需求进行编程触发点且具备超时中断功能。FIFO功能非常必要。当大量数据连续传输时,需要单片机每0.5秒处理数据帧格式并配置串口DMA等,这需要一段时间,这段时间内新的要传输的数据就可以暂存在FIFO缓冲区,等待下一个周期的处理。

蓝牙模块都连接在串口扩展芯片WK2114的四个子串口通道上,初始化完成后,当任一个蓝牙设备发送数据都会存在对应子串口的FIFO中,当满足FIFO的触点或超时中断条件时,都会触发单片机的外部中断,进入外部中断服务函数。考虑到可能会有多个蓝牙设备同时发送,而所有的子串口触发中断的引脚是共用的,所以每次进外部中断,都对每个子通道的FIFO进行读取并置位设备收到过数据的标记,保证不会漏掉数据。从每个子通道的FIFO都会读取到数据长度和数据,要将新收到的数据存储到对应的存储数组中,同时记录存储数组的总长度。根据扩展芯片的特性,当从某通道的FIFO读出数据时,该通道对应的中断标记位就会清零的,基于此,在中断服务函数中会循环检查FIFO中是否有新的中断标记产生,如果有就继续读出,一直到4个FIFO中都没有产生新的中断标记。这样在中断服务过程中,如果已经读过的子串口又收到了数据,也会把新收到的读出来并清掉新产生的标记,保证不会在读某个子串口数据的时候,漏掉其他子串口刚好发过来的数据。

数据上传服务器是0.5秒一次,为了保证上传过程中还能收到蓝牙发来的数据,给每一个蓝牙设备的数据存储都分配了两个数组。每0.5秒时间到了都要切换一次接收蓝牙数据的存储数组,以便让下一个0.5秒接收的数据存在另一个数组里。这样每个0.5秒的周期到来时,程序会通过串口DMA将上一个周期内收到的数据发送出去,同时在触发新的数据接收中断时,会将数据存储到另一个数据存储数组中,实现对数据接收和发送的乒乓操作,避免数据丢失。

对于每个蓝牙设备,0.5秒可能收到的最大的数据量要了解清楚,以便分配足够的缓存数组,本设计中,电子听诊器音频的数组长度经过理论估算和实际测试,数组长度设为8000,其他三个设备的数据量小,缓存数组长度设置为255。

本段程序流程用如下的伪代码表示。

■ 2.7 数据上传服务器

当网关处于非空闲状态时,每0.5秒判断一次蓝牙设备有没有数据发送过来,如果有,就把0.5秒收到的数据上传给服务器。连续的两个0.5秒的周期分别称为阶段1和阶段2,每次阶段变化时,去发送上一个阶段收到的数据。蓝牙有没有数据依据外部中断服务器中产生的标记。上传服务器的数据包包含帧头、设备号、数据长度、数据代号、数据内容、校验码等,所以在数据发送前要给待发送的数据加上这些帧格式。然后启动WIFI模块或4G模块对应的串口DMA发送功能,把数据发出去,使用WIFI模块还是4G模块,去前面描述的逻辑决定。当数据传输完成后,要立刻清掉数组里面数据和数据长度。注意,单片机串口DMA将数据发送到WIFI模块的速度比较高,当连续发送的数据量非常大,比如发送电子听诊器的音频数据时,WIFI模块可能会来不及把WIFI模块从串口收到的数据及时发送给服务器,造成数据拥堵,从而丢失传输数据,所以该串口必须开启硬件流控功能,这样当WIFI模块内部缓存的数据量比较大时,WIFI模块会通过流控让串口暂停发送。程序逻辑和流程如下所示。

3 结束语

本设计经过调试和验证,能可靠的连接四个蓝牙医疗设备并接收数据,同时可以完整的把蓝牙数据发送到云服务器,可以做为远程家庭医生系统中的重要组成部分。本设计为蓝牙设备和云服务器之间的数据传输提供了一种设计思路,设计所用的蓝牙医疗设备也换成其他的蓝牙设备,只需要更改蓝牙连接的初始化部分。后期也可以把更换蓝牙设备连接的过程做到用户交互功能里面,使本网关有更大的通用性,便于推广使用。需要注意的是,网关的设计要考虑数据的吞吐量,本设计的传输速度可以满足这类物联网设计的要求,如果数据产生的又快又多,比如四个蓝牙全部是音频,就要重新考虑各模块的传输速度了。

本文重点是对设计逻辑的说明,常用的基础的代码没有详细列出来,比如外设的初始化,IIC总线的操作、按键操作,显示操作等等,这样做是想尽可能的说明软件的逻辑思路和构造,希望能为广大的单片机开发者提供一定的参考价值。

猜你喜欢
串口网关中断
智能燃气表物联网运行体系网关技术研究
基于FPGA的工业TSN融合网关设计
基于ARM架构的工业物联网网关研究与实现
TMS320F28335外部中断分析与研究
雪后林鸟
跟踪导练(二)(5)
MCS—51单片机中的多串口通讯技术的应用
全国计算机等级考试机房准备工作探讨
微机串口的测试诊断
新闻浮世绘