APP下载

供热换热站预付费系统通信技术应用研究

2016-11-19罗丹厉虹周淑一

中国新通信 2016年20期
关键词:读卡器

罗丹 厉虹 周淑一

[摘要]Windows CE人机界面是面向移动计算机和嵌入式应用的操作系统,具有友好的用户界面和强大的通信能力,RS-232串行通信是WinCE支持的最基本通信方式。本文将RS-232串行通信技术应用于供热领域换热站的预付费智能控制系统,设计了在WinCE操作系统下,实现RS-232人机界面与读卡器之间以及$50非接触射频卡与读卡器之间的通信程序,较好地解决了串口之间的通信问题,最终利用S8读卡器软件平台对编写程序做以验证,为从事串口程序开发者提供了参考。

[关键词]Windows CE 串行通信 读卡器 S50非接触射频卡

目前,国内供热领域对公建单位管理模式有所改进,形成一种换热站预付费智能控制系统解决方案,而预付费智能控制系统离不开人机界面与读卡器、读卡器与IC卡之间的通信。串行通信是计算机通信的重要方式,以其设备价格低廉、连接简单、技术成熟等优点得到广泛应用。Windows CE是微软推出的一个多任务、有友好界面、强大通信能力的32位开放实时操作系统,WinCE系统以其良好的性能得到越来越广泛的应用。

二、WinCE环境下的串行通信

串行端口和应用程序的沟通是通过串行装置驱动程序完成的,即通过操作系统中文件系统的应用程序开发接口存取串行装置驱动程序,以传送/接收信息和控制串行装置。一般通信串口软件结构如图1所示:

串行设备被视为用于打开、关闭、读写串行端口的常规、可安装的流设备。WinCE的通信函数和其他大多数Windows的通信函数相同,但WinCE不支持直接对串行端口的寄存器进行编程。所使用串行端口部分函数有:

2.1打开和关闭串口通信端口

打开串行端口使用函数CreateFile,若打开端口不存在,则CreateFile回传“ERROR_FILE_NOT_FOUND”信息,且用户被通知这个端口不存在。

打开串行通信端口的步骤如下:

(1)使用参数IpzPortName传入指定的串行端口名称。

(2)将参数dwShareMode设为0,表示不允许此COM口被其他应用程序同时打开。

(3)将参数dwCreationDisposition设为OPEN_EXISTING。

(4)将参数dwFlagsAndAttributes设为0,Windows CE只支持非交错式输入/输出。

//打开串行端口

hPort=CreateFile(Serealcom,//指定串口名称

0,//共享模式

OPEN_XISTING//打开方式

0);//串口属性

当应用程序使用串行通信端口通信完毕后,使用函数CloseHandle关闭串行通信端口。CloseHandle被呼叫之后,在串行端口通信被关闭和资源释放之前,会有2秒的延迟。

2.2设定串行通信端口

以DCB(device-control block)结构设定好串行通信端口,呼叫CreateFile函数打开一个有默认串行端口设定值的串行端口,使用GetCommState函数取得默认值,再使用SetCommState函数完成新值的设定,使用COMMTIMEOUTS结构设定读写操作的逾时值。

DCB PortDCB;//创建DCB

PortDCB.DCBlength=sizeof(DCB);//初始化

GetCommState(hPort,&PortDCB;);//取得默认port设置

PortDCB.BaudRate=1 15200;//传输波特率

PortDCB.Parity=NOPARITY;//校验位

PortDCB.StopBits=ONESTOPBIT;//停止位

对于串口通信端口,应用程序必须使用COMMTIMEOUTS结构来设定串口端口的逾时值。通常,配置超时值和配置串口类似。首先用Get CommTimeots函数获得当前串口的超时值,然后可以修改COMMTIMEOUT成员,最后用SetCommTimeouts函数设定超时值。

COMMTIMEOUTS CommTimeouts;//声明结构

GetCommTimeouts(hPort,&CommTimeouts;);//获得当前的超时值

//变更COMMTIMEOUT结构的设定值

SetCommTimeouts(hPort,&CommTimeouts;);//设定读写动作的逾时值

2.3读取/写入通信串口

读取通信端口使用ReadFile函数接收从其他末端的串联连接装置来的信息,需要注意的是WinCE不支持重叠I/O,所以如果在主线程进行大量读写串口操作时,有可能使整个程序陷入缓慢的串口等待中去,因此一般都采用多线程来进行读写串口操作。WinCE不支持交错式I/O,故其参数设置为NULL。读取串行通信端口程序如下:

ReadFile(hPort,&Byte;,//指向读取的信息存放之处

1,//欲读取的字节个数

&dwBytesTransferred;,//实际读取的字节个数

NULL//不支持交错式I/O

串行通信端口使用WriteFile函数连接到另外的装置传输信息,由于WinCE串行通信不支持交错式I/O,故应用程序的主要线程或建立任何窗口的线程不应写进大量信息到串行端口,否则这些线程会被阻塞等待输入/输出完成无法管理其他相关信息队列,写入串行通信端口的程序如下:

WriteFile(hPort,&Byte;,//指向欲写入的信息

1,//欲写入数据的字节个数

&dwBytesWritten;,//实际写入的字节个数

NULL//不支持交错式I/O

三、S50非接触射频卡与读卡器通信

3.1硬件组成

本预付费智能控制系统读卡器采用峰华科技S8型双界面读卡,通过RS232串行接口与人机界面连接,工作频率为13.56MHz,支持非接触卡MIFARE系列/DESFIRE/ICODE2等常见IC卡和CPU卡,本次测试与PC采用COM3连接,IC卡采用广泛应用的S50卡,容量8k,分16个扇区,每个扇区4块,每块16个字节,每个扇区有独立的一组密码及访问控制;IC卡有唯一的32位序列号,具有防冲突机制,可对数据块进行初始化、读、写操作,每个扇区的块3为控制块,包括密码A、存取控制以及密码B,结构为:A0 A1 A2 A3 A4 A5 FF 07 80 69 B0 B1 B2 B3 B4 B5,图2为S50卡读写单元结构。

3.2软件设计

目前用汇编语言开发串行通信程序的应用较多,通常利用Mscomm控件、第3方动态链接库和调用API函数三种方式编写串行通信程序,Win32中使用API函数开发通信程序时串口和其他通信设备均被作为文件处理,串口的打开、关闭等操作使用的API函数与操作文件的函数相同。本文基于VC开发串行通信程序,利用第3方提供的动态链接库以及调用API函数编写通信程序。

系统使用umf.dll动态链接文件,在读取IC卡以及读卡器上所存放的电压数据时,调用实现串口通信。其中iport参数是串口号,系统采用的是COM3串口通信,iBaud参数是传输波特率,根据用户需求,传输波特率设定为115200,iSerialNo参数是读卡器的序列号,系统规定为0。具体的传输协议使用动态链接库的函数来实现数据通信,所以不再设置。

使用WinAPI进行串口通信程序设计具有很强的灵活性,Windows的API函数存放在动态链接库中,调用函数API可以实现串口通信,图3为$50卡与读写器的通信流程简图。

对于复位应答来说,通信协议和通信波特率已经是定义好的,当有卡片进入读写器操作范围时,读卡器与之通信来确定是否为本系统卡片类型,本系统设定一次只能选择一张卡进行操作,故防冲突机制就是当有多张卡进入读卡范围时从中选择一张进行操作,其他的等待下次读卡,同时返回选中射频卡的序列号。选定要处理的卡片对扇区密码进行校验确保无误进行后续读写操作。

根据通信协议约定在主机控制单元对射频卡读写控制时需要握手连接,利用如下代码,若三次均成功则数据开始传送,否则关闭端口。

Serial.SendData(&STX;_request,1);//发送联络信号

Sleep(1000);//等待回应

Serial.Read_Data(&read;_Buffer,1);//读取射频卡读写模块响应信号

if(read_Buffer==DLE)

//在此进行命令数据传送

else

Serial.Close();//操作完成后关闭端口

若握手成功则对卡片进行密码验证等系列命令,以下为部分源程序:

fw_getver(icdev,linchar);//获取设备号

fw_request(indev,0,tagtype);//发出寻卡请求

fw_anticoll(icdev,0,&snr;);//防碰撞控制,返回卡序列号

show(“Find Card Ok!”1:

linstr.Format(“%u”,cardsnr;

show(linstr);

fw_select(icdev,snr,&size;);//选择某一序号的卡,size返回卡的容量大小

if(fw_authentication(icdev,0,key)!=0)//核对扇区密码

printf(“Authentication error!”);

else

show(“Auth Card Ok!”):

fw_read(icdev,4,data)//读IC卡块4数据

fw_changed3(iedev,1,keya,ctrlword,0,keyb);∥修改一扇区块3密码

fw_halt();//读写一次后挂起,直到卡重新进入有效范围

本系统采用S8型读写器软件平台对编写程序进行测试,首先连接数据通信线并打开S8.exe,对程序中部分功能进行验证,图4为连接成功后显示的设备型号F#W-FMl702-V1.00,序号为预先设置的0。

本系统通信线连接使用COM3接口,故在初始化端口时选COM3端口并设置波特率为115200,图5为初始化端口并设置参数。

S50卡分16个扇区,每个扇区由4块组成,共有0-63块,其中第0扇区的块O存放厂商代码,已经固化不可更改。系统对扇区3进行密码验证,如果不成功则返回重新寻卡操作,读写卡测试随机选扇区4进行读写卡操作,点击读卡可看到扇区4里面的数据均读出,且可改变数值进行写卡操作。图6、7分别为验证扇区3密码以及读写卡操作。

四、结论

基于VC语言实现在Windows CE平台上的串行端口通信应用于换热站智能预付费系统。利用调用WIN32 API函数的方式设计并开发S50卡与读卡器的通信程序,在s8读卡器上进行验证,能接收到来自S50非接触射频卡上的数据,实现了读卡器与IC卡之间的通信,该方法对实现基于WinCE的串口通信有一定参考价值,此串口程序的设计及开发为也为更多通信工程师提供了参考。

猜你喜欢

读卡器
与淘汰命运抗争 看懂笔记本的读卡器
读卡器
iPhone读卡器
颜值与功能并重
基于EMV非接通信规范的非接触读卡器设计
多合一读卡器