基于树莓派的孕妇生命体征采集系统设计

2022-12-21 07:41
无线互联科技 2022年19期
关键词:测量仪树莓病历

刘 洋

(南京市妇幼保健院信息中心,江苏 南京 210001)

1 项目背景及概述

生命体征监测主要是对患者血氧饱和度、心电、体温、血压以及呼吸等生理参数进行监测[1]。近年来,南京市妇幼保健院为更好地贯彻落实国家三孩生育政策,积极应对人口老龄化国家战略,加强生育全程孕产期保健服务,提高优生优育水平,保障母婴安全,为孕产妇产检提供方便快捷的一体化生命体征测量方案,购置了一批一体化生命体征测量仪。将传统的体重秤、身高测量仪、血压计、体脂仪、温度计5种常见的孕妇生命体征采集终端整合为一台一体化的测量仪器,极大地缩短了孕妇测量生命体征所需要的时间。但仍然需要孕妇自己记录数值后告知护士人工录入电子病历系统,易造成数据录入错误,增加了孕妇不必要的就诊时间和护士的工作量。使用树莓派连接测量仪器的RS232C串口,读取仪器返回测量数据解析后,再通过电子病历提供的WebService接口协议,将孕妇的生命体征数值传入电子病历,可以有效避免数据误差,缩短孕妇产检的时间,提升孕妇对医院的满意度。

2 系统构成

2.1 硬件平台

本项目采用树莓派作为整个系统的控制核心。因为Raspberry Pi具备一个PC上面完整的功能,可以实现程序的编译以及运行[2]。最新版本的Raspberry Pi 4B型拥有以1.5 GHz运行的64位四核处理器,最高支持以60 fps速度刷新的4 K分辨率的双显示屏,高达4 GB RAM,2.4/5.0 GHz双频无线LAN,蓝牙5.0/BLE,真千兆以太网,USB3.0和PoE功能。通过装载相应的Linux系统和相应的应用程序,树莓派可以实现强大的应用功能,具有价格低廉的优势,为使用者提供了一个理想的嵌入式开发平台。

2.2 软件平台

树莓派目前支持最好的操作系统是Linux,Linux与Windows相比具有开源免费的优势,更高的代码执行效率,具有良好的稳定性可以像Unix系统一样常年不关而不曾宕机。程序开发语言采用C++语言,C++语言既保留了C语言的有效性、灵活性、便于移植等全部精华和特点,又添加了面向对象编程的支持,具有强大的编程功能,可方便地构造出模拟现实问题的实体和操作;编写出的程序具有结构清晰、易于扩充等优良特性,适合于各种应用软件、系统软件的程序设计。用C++编写的程序可读性好,生成的代码质量高,运行效率仅比汇编语言慢10%~20%。

2.3 系统组成

本系统硬件采用树莓派四代B型开发板,软件采用Linux操作系统,使用USB转串口线一端连接一体化生命体征测量仪的RS232C串口一端连接树莓派的USB口,使用网线连接树莓派与医院的内网,系统组成如图1所示。

图1 系统构成

2.4 电子病历系统后端接口服务

电子病历系统后端接口服务程序采用Web Service技术进行开发,程序开发语言使用Java。Web Service是一个SOA(面向服务的编程)的架构,使用XML来封装数据,通过Internet进行基于http协议的在客户端和服务端之间传输数据。Web Service的跨开发语言与跨平台性,恰好满足了本系统前后端程序的相互交互。

3 系统实现

3.1 系统整体操作流程

孕妇使用扫描枪扫码获得挂号凭条上的ID号,树莓派通过网络调用电子病历系统提供的获取孕妇基本信息的Web Service接口使用ID号作为参数将获取到的孕妇基本信息显示在树莓派连接的3.5寸液晶显示屏上。确认无误后,点击屏幕上的开始测量按钮,树莓派通过串口向一体化生命体征测量仪传送开始测量的命令,孕妇根据一体化生命体征测量仪的语音提示,进行体温、血压、身高、体重、体脂的测量。仪器测量完毕通过串口将数据发送回树莓派,树莓派使用分析程序将串口捕获数据分析加工后通过网络调用电子病历系统提供的接收生命体征数据的Web Service接口,电子病历后端服务根据孕妇的唯一ID将生命体征数据存入数据库,医生产检时打开孕妇电子病历即可查看孕妇的生命体征。

3.2 硬件连接

在树莓派终端输入命令:dmesg|grepttyS∗可以显示从系统启动到现在串口插入拔出的设备信息,使用USB转RS232C转接口连接一体化生命体征测量仪端RS232C串口与树莓派的USB口。再次输入命令:dmesg|grepttyS∗,运行结果:usb 2-2.1:pl2303 converter now attached to ttyUSB0;可以找到一体化生命体征测量仪与树莓派的通信端口为ttyUSB0。在Linux下,所有的设备都是以文件的形式存在的。都存在在/dev目录下。在/dev目录下的每个文件都对应一个设备。通过命令ls/dev/tty∗最终找到硬件设备文件标识为/dev/ttyUSB0。

3.3 RS232串口通信原理

串口通信主要通过ASCII码进行传输,采用地线进行接收和发送,通信段在一条线路中发送信息,可在另一条线路中进行接收。其中,波特率、数据位、奇偶校验位等参数十分关键[3]。

(1)波特率。这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。提到时钟周期时,就是指波特率,例如,一体化生命体征测量仪通信协议需要4 800波特率,则时钟是4 800 Hz。

(2)数据位。这是衡量通信中实际数据位的参数。计算机发送一个信息包时,实际的数据不会是8位的,标准的值是5,7和8位。如何设置取决于想传送的信息。一体化生命体征测量仪数据使用扩展的ASCII码是0~255(8位),每个数据包使用8位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。

(3)停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位,一体化生命体征测量仪的停止位为1。由于数据是在传输线上定时的,每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此,停止位不仅表示传输的结束,还提供计算机校正时钟同步的机会。停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

3.4 树莓派对数据的采集和分析

串口数据解析流程如图2所示。

图2 数据解析流程

树莓派接收到的仪器传输数据以ASCII码方式进行编码格式,如表1所示。

表1 一体化生命体征测量仪串口通信协议

分析现每一个数据都以“81$”起头,编写程序首先定义变量m_sMachineData保存原始字符串,类变量patient_data用于保存本次测量各种生命体征数据值,再根据图表5的通信协议将变量m_sMachineData的原始数据进行分析,将身高、体重、低血压、高血压、心率、体脂、体温数据分别保存在strHeight,strWeight,strLow,strHigh,strRate,strFat,strTemperature这些变量中,调用函数fun_analysisComDate()将得到的各个体征数据作为 参 数 生 成patient_data,最 后 调 用 函 数fun_PrintPatientData()打印出本次的测量结果。解析主要实现代码如下:

WzSerialPort usb_com;

PatientData patient_data;//保存孕妇本次测量结果

int i=0;int j=0;

char m_sMachineData[1024]={0}; char strHeight[128]={0};char EmerFlag[128]={0};

char strWeight[128]={0}; char strLow[128]={0};

char strHigh[128]={0}; char strRate[128]={0};

char strFat[128]={0}; char strTemperature[128]={0};

if(usb_com.open("/dev/ttyUSB0",4800,0,8,1))

usb_com.send("60$",3);

cout<<"发送体重秤握手消息"<<endl;

while(true)

memset(m_sMachineData,0,1024);

usb_com.receive(m_sMachineData,1024);

cout<<"收到体重秤通过串口发回的数据"<<endl;

cout<<m_sMachineData; //打印出原始数据

//81$21755$00652$3$B120075069$0203 01471614055007031605085093209145252397105074290 848$T365$

//开始解析相关数据值

i=this->m_sMachineData.Find("81$",j);

for(;;)

if(i==-1)

break;

j=this->m_sMachineData.Find("$",i);

strHeight=this->m_sMachineData.Mid(i+1,j-i); //得到身高数据175.5厘米;

j=this->m_sMachineData.Find("$",i);

strWeight=this->m_sMachineData.Mid(i+1,j-i); //得到体重65.2千克;

j=this->m_sMachineData.Find("$",i+1);EmerFlag=this->m_sMachineData.Mid(i,1);if(EmerFlag=="B")

strLow=this->m_sMachineData.Mid(i+1,j-6-i); //得到血压高压120

strHigh=this->m_sMachineData.Mid(i+3,j-3-i); //得到血压低压75

strRate=this->m_sMachineData.Mid(i+6,3); //得到心率69

j=this->m_sMachineData.Find("$",i);

strFat=this->m_sMachineData.Mid(i+1,j-i); //得到脂肪数据

j=this->m_sMachineData.Find("$",i);

EmerFlag=this->m_sMachineData.Mid(i,1);

if(EmerFlag=="T")

strTemperature=this->m_sMachineData.Mid(i+1,ji);//得到体温数据36.5

//保存本次测量结果

this->AddTestItem(strHeight,strWeight,strLow,strHigh,strRate,strFat,strTemperature,&patient_data);

i=this->m_sMachineData.Find("81$",j+1);

else

cout<<"打开串口失败";

usb_com.close();

//分析本次测量结果

fun_analysisComDate(&patient_data);

//输出本次测量结果

fun_PrintPatientData(&patient_data);

return 0;

数据接收程序在树莓派上的运行结果,如图3所示。

4 结语

以上设计经临床实际使用,通过使用树莓派作为一体化生命体征测量仪数据传输及解析平台,在信息化条件下,采用智能控制和信息处理技术,进行医院自助服务信息化智能终端建设和自助服务平台的优化设计,充分利用“互联网+”,打造为患者服务的高效信息化平台[4]。该平台避免了传统的由医护人员人工进行测量时存在操作差异性而产生的数据误差,同时,也缩短了孕妇的产检就诊时间,为孕妇提供了方便,提升了孕妇对医院的满意度,具有一定的推广价值。

猜你喜欢
测量仪树莓病历
强迫症病历簿
“大数的认识”的诊断病历
基于树莓派的骑行智能头盔设计
基于单片机的便捷式LCF测量仪
基于树莓派的远程家居控制系统的设计
宽电容测量仪的设计
为何要公开全部病历?
响应面法优化红树莓酒发酵工艺
村医未写病历,谁之过?
欧盟:速冻树莓比鲜食树莓市场更好