随着医院信息系统技术日趋成熟,如今医院信息系统在医院得到广泛应用.检验信息系统(LIS:Laboratory Information System )是医院信息系统中一个较大组成部分.利用计算机对检验仪器进行数据的自动采集是医院检验科室信息化建设中的重要内容.串口因其速度快所以是目前检验仪器大量采用的一种数据传输端口.PB (PowerBuilder )工具软件是Sybase 公司开发的分布式数据库应用程序的前端开发工具,它以功能强大、使用灵活的数据
窗口,面向对象的、具有可视图形界面的开发能力
等优势,因此深受广大数据库开发人员的青睐.目前使用PB 作为大型医院信息系统前端开发工具占据了很大比例,使用PB 进行LIS 系统串口通讯程序的开发也是被广泛应用的一种方式.1MSComm 控件常用的属性及通讯方法
在使用PB 开发LIS 系统串口通讯程序应首先来了解一下微软的Microsoft Communications Con-trol (简称MSComm )控件,MSComm 属于Windows 下串行通讯编程的ActiveX 控件,它为应用程序提供了通过串行端口传输和接收数据,为应用程序提供串行通讯功能.
1.1MSComm 控件的常用属性
CommPort :设置用户所选用的通讯端口号.Settings :以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位.
PortOpen :设置通讯端口的状态,可以打开(值为True )或关闭端口(值为False ).
Input :从接收缓冲区返回和删除字符.Output :向传输缓冲区写一个字符串.
InBufferSize:设置或返回接收缓冲区的大小,缺省为1024字节.
InBufferCount:返回接收缓冲区内的等代读取的字节个数,设属性为0清除接收缓冲区.
OutBufferSize:设置或返回发送缓冲区,缺省为
512字节.
OutBufferCounter:返回发送缓冲区内等待发送的字符数,可用0来清空缓冲区.
RThreshold:该属性确定当接收缓冲区内字节个数达或超过该值后就产生代码为ComEventRe-ceive 的OnComm 事件,设置位0,则不产生On-Comm 事件.
CommEvent:有通讯错误或事件发生时产生OnComm 事件,CommEvent 事件的值可以用来确定引发OnComm 事件的具体的错误或事件常用的有以下几种
☆ComEventbreak :接受到中断信号.☆ComEventRxOver :接收缓冲区溢出.☆ComEventTxFull :发
送缓冲区溢出.
☆ComEventReceive :接受到规定的字符数.☆InputLen:设置或返回接收缓冲区内用In-put 读入的个数.若取0,则读取整个缓冲区的内容.1.2MSComm 控件的通讯方法
MSComm 控件在处理串口通讯上有两种方法:一是事件驱动法;二是查询法.这两种方法各自的特点如下:
(1)事件驱动法是利用MSComm 控件的On-Comm 事件捕获并处理通讯错误或事件,是处理串行端口交互作用的一种非常有效的方法.当串口接收到或发送完指定数量的数据时,或当状态发生改变时,MSComm 控件都将触发OnComm 事件,该事件也可以捕获通讯中的错误.当应用程序捕获到这些事件后,可通过检查MSComm 控件的Com-mEvent 属性的值来获知所发生的事件或错误,从而执行相应的处理.这种方法具有相应及时,可靠性高等优点.
(2)查询法是在每个重要的程序之后查询
利用PowerBuilder 实现LIS 系统中的串口通讯
南晓北,书
(赤峰学院医学院,内蒙古赤峰024000)
摘要:本文介绍了如何使用PowerBuilder 中的MS Comm 控件来实现检验仪器与计算机之间的串口通讯.
关键词:LIS ;MS Comm 控件;串口通讯
中图分类号:TP274文献标识码:A
文章编号:1673-260X (2011)11-0049-03
Vo l.27No .11
Nov.2011
第27卷第11期2011年11月赤峰学院学报(自然科学版)J o urnal o f Chifeng University (Natural S cience Editio n )49--
. All Rights Reserved.
MSComm控件的某些属性(比如CommEvent属性和InBufferCount属性)的值来检测事件和通讯错误. 2
程序实例描述
在前面我们对MSComm控件有所了解之后,我们就可以将MSComm控件引入到程序中.整个LIS系统的数据流程包括HIS开出检验申请信息, LIS主程序读取数据,仪器检验结果数据通过通讯程序写入LIS结果数据表等.本文所要研究的就是仪器检验结果通过通讯程序写入LIS结果数据表这一程序实例.
第一步:选择适合的数据库设计相关数据表(这个主要是根据使用需要和编程人员的使用习
惯)就我看来使用中型数据库如:SQL Server就可以.
第二步:设计应用程序界面.在这里主要说一下如何插入MSComm控件,在设计窗口插入MSComm控件的步骤:选中Create OLE Control 在Insert Object会话框中选中Insert Control页卡中的Microsoft Communications Control项,这便完成了添加MSComm控件.如下图.
第三步:这一步是编写程序的重点与难点,在完成上面的界面设计之后我们就要为界面里的控件编写代码.在界面设计时除MSComm控件外还有两项是必需要设计的.一个是通讯端口选择,因为一台计算机有多个串口(com1,com2,……)如果一台计算机连接两台或更多的仪器时就要凭借通讯端口来区分数据和接收数据.另一个是通讯参数配置,检验仪器进行数据传输时会根据仪器自身的参数来进行通讯,这些参数包括:波特率,数据位,停止位,校验位.
接下来我们来重点看一下对MSComm控件相关事件及相关函数的编写.
2.1为MSComm控件编写Oncomm事件
注:代码中ole_comm_one为MSComm控件的名称
String ls_receipt_data
char lc_char_data
Integer li_len,i
ls_receipt_data=ole_comm_one.object.Input
if gs_status='P'then return
li_len=Len(ls_receipt_data)
for i=1to li_len
lc_char_data=Mid(ls_receipt_data,i,1)
f_comm_char_monitor(lc_char_data)
next
2.2f_comm_char_monitor函数
它的功能是当有字符触发则进行接受,代码如下:
Integer li_asc_value
li_asc_value=Asc(lc_data)
CHOOSE CASE li_asc_value
CASE STX
gs_current_result=lc_data
CASE ETX
gs_current_result+=String(lc_data)
f_analyse_data(gs_current_result)//对接收的数据进行分析
gs_current_result=""
CASE ELSE
gs_current_result+=String(lc_data) END CHOOSE
return0
2.3f_analyse_data函数
它的功能是分析结果数据,分离出工作单号及结果(在下面代码中有被注释的定义参数,把它写进来是来讲述如何使用MSComm控件相关参数).
integer BlockSeqOffset=2
integer BlockSeqLength=1
integer FuOffset=3
integer FuLength=2
integer SampleNoOffset=5
//integer SampleNoLength=5
//integer DiskNoOffset=10activex 控件
//integer DiskNoLength=1
//integer PositionNoOffset=11
//integer PositionNoLength=3
//integer IdNoOffset=14
//integer IdNoLength=13
//integer AgeOffset=27
//integer AgeLength=4
//integer SexOffset=31
/
/integer SexLength=1
//integer BldColTimeOffset=32
//integer BldColTimeLength=10
integer ChannelCountOffset=42
integer ChannelCountLength=3
50
--
. All Rights Reserved.
integer ResultDataOffset=45
integer li_channel_count,i
string ls_block_seq,ls_fu,ls_channel_block
String ls_result_data
String ls_property_char
String ls_working_id
String ls_instru_item_code,ls_instru_item_ hard_code
String ls_item_result
String ls_indicator
String ls_unit
ls_result_data=ls_data
ls_fu=Mid(ls_result_data,FuOffset,FuLength)
if not(ls_fu='N1'or ls_fu='N2'or ls_fu ='n1'or ls_fu='n2')then
w_main.tab_show.tabpage_current_result.mle_ =ls_data
return1
end if
ls_block_seq=Mid(ls_result_data,Block-SeqOffset,BlockSeqLength)
li_channel_count=Integer(Trim(Mid(ls_re-sult_data,ChannelCountOffset,Channel-CountLength)))
if ls_block_seq='1'then//消息开始记录
g_unt=0
end if
for i=0to li_channel_count-1
ls_instru_item_hard_code=Trim(Mid(ls_re-sult_data,ResultDataOffset+i*10+1,3))
ls_instru_item_code=ProfileString(gs_in-i_file,'ItemCodeAlia',ls_instru_item_hard_code, ls_instru_item_hard_code)
ls_unit=ProfileString(gs_ini_file,'ItemU-nits',ls_instru_item_hard_code,'')
ls_item_result=Trim(Mid(ls_result_data, ResultDataOffset+i*10+4,6))
ls_indicator=Trim(Mid(ls_result_data,Re-sultDataOffset+i*10+10,1))
g_unt++
g_struc_result.item_no[g_unt]= g_unt
g_sult[g_unt]= ls_item_result
g_struc_result.instrument_item_code[g_struc_ unt]=ls_instru_item_code
g_al_indicator[g_struc_result. count]=ls_indicator
g_struc_result.units[g_unt]= ls_unit
next
if ls_block_seq=':'then//消息结束记录g_sult_datetime=DateTime (Today(),Now())
ls_working_id=String(Integer(Mid(ls_re-sult_data,SampleNoOffset+(5-gi_Sam-pleNoLen),gi_SampleNoLen)),Fill('0',gi_Sam-pleNoLen))
g_struc_result.working_id=ls_working_id
if w_main.ib_display_result then
w_main.wf_display_result(g_struc_result)
end if
w_main.wf_save_result()
g_unt=0
end if
Return0
上面描述的是在程序中最为重要的事件及两个函数,还有其它的细节(如:建立数据窗口向数据库插入检验结果数据等等)因其不是实现检验仪器与计算机通讯的重点所以在这里不作过多累述.
3结论
在编写LIS通讯程序时除对编程方法熟练外还要对检验仪器有基本的认识,最好是能够掌握其使用方法及检验项目的相关知识.通过上述对MSComm控件使用方法及实例完全可以实现医院检验科检验数据的自动采集,也能够对医院检验方面的信息系统建设起到一定的帮助作用.
———————————————————
参考文献:
〔1〕刘恩博.组态软件数据采集与串口通信测控应
用实战[M].北京:人民邮电出版社,2010.〔2〕李朝青.PC机及单片机数据通信技术[M].北京:
国防工业出版社,2002.
〔3〕范逸之.Visual Basic与RS232串行通信控制[M].北京:中国青年出版社,2000.
51
--
. All Rights Reserved.