射频通讯服务器的设计与实现

时间:2022-04-01 03:19:41

【前言】射频通讯服务器的设计与实现由文秘帮小编整理而成,但愿对你的学习工作带来帮助。关键词:射频通讯服务器数据采集射频通讯模型 Key words: RFID-Communication Server;Data Collection;RFID-Communication Model 中图分类号:TP39 文献标识码:A文章编号:1006-4311(2011)19-0140-02 0引言 射频作为一种物体识别技术已被广泛应用在各个领域。在...

射频通讯服务器的设计与实现

Design and Implementation of RFID-Communication Server

Xing Xue

(Shangluo University,Shangluo 726000,China)

摘要:为了能够有效的识别和采集到射频识别标签的信息,有必要将射频通讯部分作为一个单独的模块。文章介绍了射频数据采集的核心技术,建立了射频通讯服务器模型,并且在Visual C# 2005编程环境中进行具体的设计实现。通过编程实践证明,射频通讯服务器可以作为一种通用的基于射频的物体识别信息系统的数据采集模块。

Abstract: In order to effectively identify and collect information of RFID tags, it is necessary to take concern on the part of the radio frequency communications as a separate module. This paper describes the core technology of radio frequency data collection, and establishes a radio communication server model, and implements in Visual C # 2005 programming environment for the specific design. Proved by this paper, RFID-communication server can be used as a generic object recognition based on RFID information system data acquisition module.

关键词:射频通讯服务器数据采集射频通讯模型

Key words: RFID-Communication Server;Data Collection;RFID-Communication Model

中图分类号:TP39 文献标识码:A文章编号:1006-4311(2011)19-0140-02

0引言

射频作为一种物体识别技术已被广泛应用在各个领域。在基于射频的物体识别信息系统的设计与实现中,如何识别与采集物体携带的识别标签信息是整个系统的关键所在。为了有效地对采集到的信息进行管理,可以将射频数据通讯部分作为一个单独的模块,将采集到的识别标签信息通过有效性处理后,存储到数据库服务器中,作为系统客户端的数据来源。

因此射频通讯服务器是整个识别系统的数据核心部分。本文主要阐述了射频通讯服务器的设计与实现过程,包括射频数据采集技术的简介、射频通讯服务器模型的建立、以及在Visual C# 2005编程环境中的设计与实现。

1射频数据采集技术

各个射频读卡器通过现场总线组网后,把读取到的射频识别标签信息传送到数据通信接口,数据通信接口再通过RS232/RS485完成与监控计算机的最后通信,通过数据通据接口可以在读卡器和监控计算机之间进行有效而正确的信息传送[1]。在实际应用中,由于PC机与读卡器是通过RS232串口进行通信的,那么在应用程序中就必须提供一个接口函数,来控制串口的通信。

利用串口通信主要有三种方法[2]:①利用微软公司提供的MSComm通信控件完成Windows下的串口通信编程;②利用Windows API函数来完成对串口的操作和数据的传输;③使用SerialPort类进行串口通信。在实际系统中,通常需要安装多台射频读卡器设备,因此选用哪种串口通信方式直接影响到功能实现的灵活性与简易度。综合比较这三种方法,利用MSComm控件是一种最简单的实现方式,但是如果需要与多台读卡器进行通讯,则在程序中就要放置同样多个控件,而且MSComm属于第三方控件,需要在Visual C# 2005中对该控件进行注册后才可使用;利用Windows API函数编程,虽然可以实现各种想要的功能,但是难度较高;利用微软推出了最新版本的Visual Studio 2005开发工具,可以不再采用第三方控件的方法来设计串口通讯程序,NET Framework 2.0 类库包含了SerialPort 类,可以方便而灵活地实现所需要串口通讯的多种功能。以下列出SerialPort常用的方法、属性和事件:

1.1 命名空间System.IO.Ports命名空间包含了控制串口重要的SerialPort类,该类提供了同步 I/O 和事件驱动的 I/O、对管脚和中断状态的访问以及对串行驱动程序属性的访问,所以在程序代码起始位置需加入Using System.IO.Ports。

1.2 串口的通讯参数串口通讯最常用的参数就是通讯端口号及通讯格式(波特率、数据位、停止位和校验位),在MSComm中相关的属性是CommPort和Settings。SerialPort类与MSComm有一些区别:

1.2.1 通讯端口号[PortName]属性获取或设置通信端口,包括但不限于所有可用的COM端口,请注意该属性返回类型为String,不是mPort的short类型。通常情况下,PortName正常返回的值为COM1、COM2……,SerialPort类最大支持的端口数突破了CommPort控件中CommPort属性不能超过16的限止,大大方便了用户串口设备的配置。

1.2.2 通讯格式SerialPort类对分别用[BaudRate]、[Parity]、[DataBits]、[StopBits]属性设置通讯格式中的波特率、数据位、停止位和校验位,其中[Parity]和[StopBits]分别是枚举类型Parity、StopBits,Parity类型中枚举了Odd(奇)、Even(偶)、Mark、None、Space,Parity枚举了None、One、OnePointFive、Two。SerialPort类提供了七个重载的构造函数,既可以对已经实例化的SerialPort对象设置上述相关属性的值,也可以使用指定的端口名称、波特率和奇偶校验位数据位和停止位直接初始化SerialPort类的新实例。

1.2.3 串口的打开和关闭SerialPort类没有采用MSComm.PortOpen=True/False设置属性值打开关闭串口,相应的是调用类的Open()和Close()方法。

1.2.4 数据的发送和读取Serial类调用重载的Write和WriteLine方法发送数据,其中WriteLine可发送字符串并在字符串末尾加入换行符,读取串口缓冲区的方法有许多,其中除了ReadExisting和ReadTo,其余的方法都是同步调用,线程被阻塞直到缓冲区有相应的数据或大于ReadTimeOut属性设定的时间值后,引发ReadExisting异常。

1.2.5 DataReceived事件该事件类似于MSComm控件中的OnComm事件,DataReceived事件在接收到了[ReceivedBytes Threshold]设置的字符个数或接收到了文件结束字符并将其放入了输入缓冲区时被触发。其中[ReceivedBytesThreshold]相当于MSComm控件的[Rthreshold]属性,该事件的用法与MsComm控件的OnComm事件在CommEvent为comEvSend和comEvEof时是一致的。

2建立射频通讯模型

如果系统中需要安装多台射频读卡器,每台读卡器都需要实时地读取数据,那么在进行数据采集与控制的时候要对多个串口进行访问,而多线程的并行处理机制使得监控计算机能够同时访问多个外设,这也就使得多串口实时数据采集与控制得以实现。

串口通信对每个串口对象只提供一个缓冲区,发送和接收都要用到这一个缓冲区,所以要求必须建立同步线程机制,使得在一个时刻只能进行一种线程操作,否则通信就会出错[3]。进行串口通信处理的多个线程之间需要协调运行。一个线程必须等待另一个线程结束才能运行,在处理一个线程的同时必须把其余待处理的线程挂起等待,以减少其余待处理线程对CPU资源的占用,正处理的线程一旦处理结束则通过线程间的通信发出信号来激活被挂起的线程中的一个线程进入处理。C#提供了事件对象来协调多线程的并行[4],它用于使一个线程通知其他线程某一事件的发生,所以也可以用来封锁对某一资源的访问,直到线程释放资源使其成为有信号状态,适用于某一线程等待某事件发生才能执行的场合。

本文的射频数据采集使用SerialPort类实现,可以对每一个射频读卡器设备建立一个串口监视子线程;并设计一个射频数据处理函数,把读取到的识别标签信息处理成有效数据,此函数为公共函数,每个串口监视子线程都需要调用数据处理函数来读取和处理相对应的读卡器识别到的数据;最终将有效地识别标签数据存储到数据库中。

利用多线程多串口通讯所使用的射频通讯模型如图1所示。

3射频通讯服务器的设计

通过对射频数据采集技术和通讯模型的描述,射频通讯服务器通过以下几步完成设计,并列出部分代码:

第一步:与数据库保持连接;

第二步:串口初始化设置;

ss_port.PortName = _ReadConfig.GetNodeValue("PORT");// _sComPort;

ss_port.BaudRate = int.Parse(_ReadConfig.GetNodeValue("BAUD"));

ss_port.ReadBufferSize = 10240;

switch (_ReadConfig.GetNodeValue("PARITY"))

{

case "None":

ss_port.Parity = Parity.None;

break;

case "Even":

ss_port.Parity = Parity.Even;

break;

case "Mark":

ss_port.Parity = Parity.Mark;

break;

case "Odd":

ss_port.Parity = Parity.Odd;

break;

case "Space":

ss_port.Parity = Parity.Mark;

break;

}

ss_port.Open();//打开串口

第三步:监控计算机通过串口读取射频读卡器接收到的数据,串口接收到数据后,将调用读数据函数;

StringBuilder= new StringBuilder();

bool bRead = true;

try

{

ss_port.DiscardInBuffer();

ss_port.Write(sCommand);

Thread.Sleep(1500);

while (bRead)

{

_ReadBuffer = new byte[ss_port.BytesToRead];

ss_port.Read(_ReadBuffer, 0, _ReadBuffer.Length);

sb.Append(Encoding.ASCII.GetString(_ReadBuffer));

Thread.Sleep(500);

if (ss_port.BytesToRead

{

bRead= false;

}

}

if (sb.ToString().Length== 0)

{

nReadCount++;

}

if (nReadCount == 3)

{

nReadCount = 0;

throw new Exception("设置不正确或没有联接设备!");

}

}

catch (Exception ex)

{

throw new Exception("从设备获取数据失败!\r\n错误信息:" + ex.Message);

}

return sb.ToString();

第四步:对接收到的射频识别标签号十进制化;

for(i=1;i

{

str=txtResponse.Substring(i,7);

num=str.Substring(4,4);

CardID_Ten = Convert.ToInt32(num,16).ToString();

}

第五步:将接收到的数据存入到数据库中。

4射频通讯服务器的实现

射频通讯服务器是整个系统的核心,它负责对物体所配戴识别标签信息的接收、采集和处理,其运行步骤如下所示:

第一步,与数据库服务器相连:设置好各个参数之后即可使射频通讯服务器与数据库服务器连接起来,可以正常接收识别标签信息,并存入到数据库中。射频通讯服务器的数据库连接界面如图2所示。

第二步,启动射频通讯服务器,进入系统运行主界面,如图3所示。

5结束语

为了有效的识别和采集射频标签信息,本文比较了各种射频数据采集技术,并选择使用SerialPort 类进行具体实现;利用多线程多串口通讯建立了射频通讯模型;在Visual C# 2005编程环境中进行具体的设计与实现。通过实践证明,射频通讯服务器可以作为一种通用的基于射频的物体识别信息系统的数据采集模块。

参考文献:

[1]游战清,刘克胜等.无线射频识别技术(RFID)规划与实施.北京:电子工业出版社,2005.

[2]谭思亮,邹超群.Visual C++串口通信工程开发与实例导航.北京:人民邮电出版社,2003.

[3]张筠莉,刘书智.Visual C++实践与提高――串口通信之工程应用篇,中国铁道出版社,2006,1:185-188.

[4]马骏,郑逢斌,沈夏炯.C#网络应用高级编程.人民邮电出版社,2006.

上一篇:网络时间同步系统的设计与实现 下一篇:实训基地建设的规划与思考