射频识别(RFID)是一种非接触式的自动识别技术,它通过射频信号自动识别目标对象并获取相关数据,识别过程无需人工干预,可工作于各种恶劣环境。RFID技术在许多领域得到应用,如停车场管理、集装箱运输管理系统等。在大多数应用中,只要求有固定的阅读器,但在某些特殊系统中(如集装箱运输管理系统),不仅要求有固定的阅读器,而且还要求有手持式读卡器。
TagMaster AB公司是世界知名的RFID读卡器制造商。它提供性能优良的固定式阅读器,也提供一种手持式阅读器。手持式读卡器由Caiso公司的工业级PDA(Personal Digital Assistants)和TagMaster AB公司的S1510组成。PDA虽然功能强大,但有如下缺点:(1)提供的触摸屏输入方式过于精细,不适合工作人员现场操作;(2)TFT液晶显示屏在强光下显示效果差,耗电量大,并且在低温下(0℃以下)无法工作,因此不适合室外工作;(3)采用Microsoft公司的商用系统WinCE,成本高。
本文介绍一种基于嵌入式Linux的便携式RFID信息采集与处理系统。它采用高性能的32位ARM920T系列微处理器、8键的键盘及OLED显示屏,结合S1510实现了对电子标签卡信息的采集、处理及实时显示,很好地解决了上述问题。
1 系统组成
系统采用Atmel公司的AT91RM9200 32位高性能处理器、TagMaster公司的S1510及OLED显示模块等实现电子标签卡信息的采集、处理、实时显示及与上位机通信等功能。系统组成如图1。
1.1 微处理器
系统采用Atmel公司以ARM920T为核心的AT91系列微处理器AT91RM9200。它最高主频可达180MHz,具有先进的节电技术,集成了SDRAM、Flash、红外、USB等接口。系统采用USB(Universal Serial Bus)及红外方式与上位机通信。红外方式采用Agilent公司的HSDL-3602红外收发器实现。
1.2 射频识别模块
射频识别模块采用瑞典TagMaster AB公司的2.4GHz产品S1510。该模块体积小,专为手持设备设计,可以采集1米内各种电子标签上的数据。它通过USART串口与处理器通信,接口简单,易于硬件实现。为了保证数据的可靠传输,模块与微处理器通信采用TagMaster AB公司开发的应答式串口通信协议ConfiTalk。
ConfiTalk协议是一种面向字符的应答式串行通信协议。它每次传输一定长度的数据块(帧),每个帧包含帧头(STX)和帧尾(ETX)。为了提高数据传输的可靠性,每帧又加入了8位的校验位(CS)及地址位(ADR)。帧的结构如图2。
MESSAGE代表任意长度的信息。协议规定微处理器发送给S1510的帧为命令帧,返回的帧为应答帧。本系统使用的S1510是TagMaster AB公司的最新产品,它支持基于ConfiTalk协议的MAIL命令方式的数据传输。MAIL命令方式通信也就是把帧中的MESSAGE域统一成四种格式,其中命令帧有MAIL_SEND和MAIL_RECEIVE两种,分别表示S1510接收用户信息和返回卡信息(包括卡号、卡状态和卡存储的数据),如图3。
应答帧有两种:MAIL_SEND的应答帧和MAIL_RECEIVE的应答帧,如图4。
图4中,36表示S1510使用MAIL方式处理命令帧和应答帧,而4、5表示S1510命令帧的类型(MAIL_SEND或MAIL_RECEIVE);Status表示该命令的执行状态(成功或失败);MAIL_SEND命令帧中的Data域表示用户要进行的操作及参数,如使Data=WRITE:参数:数据,即表示用户要将数据写入电子标签卡;MAIL_RECEIVE的应答帧中的Data域为用户所要求得到的数据。
当使用MAIL命令方式读写标签卡时,用户只需要按帧的格式填充各域,然后利用ConfiTalk协议提供的API函数发送到S1510即可。命令清晰明了,大大方便了用户的开发。
1.3 OLED显示模块
系统采用莱宝科技有限公司的OLED显示模块RGS24128064YW001。有机发光显示器OLED(Organic Light Emitting Display)被誉为“梦幻显示器”。与液晶屏相比,OLED显示屏更轻更薄、可视角度更大,能够显著节省电能,并且在-40℃的低温下仍可以正常工作。RGS24128064YW001具有串行和8位并行数据接口。系统采用8位并行接口与微处理器通信。
1.4 SDRAM和Flash及自定义键盘
系统采用32位的同步动态随机存储器(SDRAM)作为系统内存,16位的Flash作为不可丢失数据存储器。用户可以通过8键的键盘进行各种操作,如读卡、写卡等。
2 系统软件设计
系统软件是整个系统的灵魂,其设计的好坏直接影响系统的稳定性和可扩展性等性能。系统设计将软件分为两层结构,如图5所示。最下面一层为操作系统层,主要实现对Linux操作系统的移植和各种设备驱动程序的编写,包括OLED模块、USB Device、红外、键盘等设备驱动程序。上一层为应用程序层,主要实现卡信息显示、键盘扫描、电子标签卡读写、文件传输、时钟以及电池电量检测等功能。
2.1 嵌入式Linux
Linux是一种公开源码的多任务操作系统,具有开放度高、安全性好、稳定性强、可移植性好等特点,在嵌入式操作系统中被大量采用。
本设计采用的Linux内核是在ARM-Linux的基础上,编写了OLED显示模块、USB 设备、红外收发器及键盘的设备驱动程序。在Linux系统中,设备驱动程序占有很重要的位置,它提供了在用户空间操作硬件设备的接口。Linux系统将设备分为字符设备、块设备及网络设备三种,并给出针对不同设备的数据结构及注册函数。当用户开发设备驱动程序时,只需按硬件操作的方法填充设备数据结构,并将它注册到内核中即可。
为了方便用户应用程序的编写,把USB设备实现为CDC(Communication Device Class)类设备,其驱动程序分为两层,最底层操作AT91RM9200上的USB设备控制器,如处理硬件中断、读写寄存器及操作I/O口来检测设备的插拔;上层实现了底层与TCP/IP协议层的连接,主要是模拟物理网卡,并注册到内核。这样,在应用程序的USB设备就是一个标准的网络设备,用户不需要了解驱动程序的接口,而直接使用Linux提供的套接字进行网络通信程序的开发。当用户进行二次开发时,可以不加修改地将上位机开发好的网络通信程序直接移植到本系统中,而且可以通过上位机的Telnet等工具对嵌入式系统进行一定的操作。
其他驱动程序(如OLED显示模块、键盘、红外收发器)都作为Linux下的标准字符设备编写,使用register_chrdev( )函数进行注册,提供了读、写和控制操作。在Linux系统中,应用程序对字符设备的操作与文件的操作相同。
Linux中设备驱动程序可以通过模块方式动态地加载和卸载,也可以直接编译到内核中。前者使用灵活,可以减小内核,但因嵌入式系统要求所有设备在初始化后全部就绪,不能在使用时加载设备的驱动模块。所以,本系统中所有的设备驱动程序都直接编译进内核。
每个设备驱动程序在用户空间对应一个设备文件,由文件系统管理。本系统使用ext2作为根文件系统。为了开发和升级方便,首先将根文件系统做成RAMDISK格式,所谓RAMDISK就是系统启动后将压缩的文件解压到内存,形成一个虚拟硬盘;然后,将引导程序、内核映像及根文件系统烧写到Flash中。
系统加电后,引导程序将内核映像从Flash中调入内存,然后从核入口开始执行:首先初始化CPU,然后加载各个设备驱动程序,最后挂载文件系统,执行应用程序。
2.2 应用程序设计
Linux是多任务系统,支持多线程及多进程。多线程的优点是线程比进程小,可以使应用更轻便,线程间通信方便;缺点是所有线程使用同一个地址空间,如果一个线程出现问题,整个系统将受影响;而进程各自占有一份内存空间,可以增强系统的稳定性,但是多进程增加了系统开销,进程间通信复杂。为此,根据实际情况,考虑到系统稳定性,本系统采取两者相结合的方式分别完成数据采集处理及文件传输功能。
2.2.1 数据采集处理
数据采集处理是一个进程,它包括主线程和辅线程。主线程完成电子标签卡信息的读取、写入、实时显示及查询;辅线程实现一个时钟以提供用户当前时间,并定时对电池的电量进行检测和动态显示,在电量过低时发出警告。
应用程序用MAIL命令方式完成电子标签卡的读写。该进程首先初始化屏幕,然后等待按键中断,当有键按下时,根据键值执行相应的工作;当指定时间内没有键按下,系统则进入休眠状态,从而达到省电的目的。程序流程图如图6。
当成功采集到标签卡信息后,应用程序将卡信息(包括卡号、卡状态、用户数据及当前时间)通过OLED显示屏提供给用户,并写入一个文件进行记录。由于文件传输进程会将该文件传输到上位机,所以当读写文件时要将文件上锁。Linux提供了文件锁以防止不同进程同时访问同一个文件。本文使用flock()函数对文件上锁和解锁。
由于OLED是图形点阵式显示屏,而且Flash容量有限,所以不可能直接使用汉字字库。系统预先提取所有用到的汉字、数字及字母的点阵数据,然后建立自己的字库文件,从而使应用程序可以对汉字、数字及字母进行显示。
2.2.2 文件传输
文件传输是一个进程,完成卡信息的上传及其他数据的下载。与上位机通信采用Clinet/Server模型。该进程实质上是一个服务器端(本系统)的应用程序,它循环等待客户端(上位机)的连接请求。当请求到达时,首先判断请求来自哪个接口(USB或者红外接口),然后根据请求的类型执行相应的上传或下载。考虑到实际应用中可能会使用多台手持式阅读器,为了方便上位机对信息的管理,规定文件名由手持式阅读器编号和文件上传序号组成,程序在上传文件时自动将其编号及上传序号加入文件名。该进程的流程如图7。
3 系统电源管理
本系统使用锂电池为系统供电。为了延长电池的续航能力,将应用程序设计为三种运行状态:上电空闲状态、程序执行状态及系统睡眠状态。当用户不进行任何操作时,系统将进入睡眠状态以达到省电目的。系统的睡眠是基于微处理器的电源管理功能实现的,进入睡眠的步骤如下:
(1)关闭所有外设;
(2)保存当前系统状态;
(3)使SDRAM进入自刷新模式;
(4)设置唤醒事件,使微处理器进入睡眠状态。
当唤醒事件发生时,如有键按下,则执行系统复位。过程如下:
(1)恢复部分微处理器的寄存器;
(2)唤醒外部设备,系统开始运行。
本文介绍了在AT91RM9200高性能ARM芯片上运行嵌入式Linux,结合TagMaster AB公司功能强大的射频识别模块S1510实现便携式标签卡的信息采集和处理。系统使用方便、灵活。另外,为克服LCD低温无法工作、亮度不够及耗电大的缺点,采用OLED显示模块使系统可以在恶劣环境下应用,并增加了电池的续航能力;为使系统与上位机通信方便,采用了支持热插拔的USB接口。
参考文献
1 Rubini A著,魏永明译.LINUX设备驱动程序(第二版)[M].北京:中国电力出版社,2002
2 张 娟,吴大伟.应用RFID的便携式数据采集与处理系统的研究[J].微型电脑应用,2005;21(6)
3 蔡 震,蒋辉柏,周利华.Linux系统下USB设备驱动程序的开发[J].计算机测量与控制,2003;11(2)
4 TagMaster AB. Sweden.Handheld Confi Talk Reference Manual[Z].2003
5 TagMaster AB.Programmer′s Guide LockTag Handheld[Z].2005
6 Robert Love.Linux Kernel Development(Second Edition)[M].北京:机械工业出版社,2005