今天是: 欢迎进入漳州理工职业学院机电工程学院!
站内搜索:
浏览信息 您当前的位置:首页 >> 浏览信息
GPRS无线通讯在测试仪器中的应用-黄慧贞
发布时间:2014-8-12 浏览次数:1089次

GPRS无线通讯在测试仪器中的应用

黄慧贞

(漳州理工职业学院  电子与机械工程系福建漳州  邮编363000

 

  要:GPRS(General Paeket Radio Service,通用分组无线业务)是在GSM(Global System For Mobile Conununications,全球移动通信系统)基础上发展出来的一种新的分组数据承载业务。它的基本功能是在移动终端与计算机通信网络的路由器之间提供分组传递业务。本课题运用C++ 6.0编写的与WinSock结合的串口通信程序,并且运用GPRS通过服务器端实现主控客户端与受控客户端之间的通信和串口控制。首先要用WinSocks类来编写一个C/S(Client/Server)程序,C/S程序包含一个服务器端和一个客户端,受控客户端程序接收主控客户端程序发来的数据后,将数据从串口1COM1)发送出去,并且接收下位机返回的数据,在受控客户端和主控客户端窗口上显示。

关键词:GPRS  串口通信  客户端/服务器端编程  WinSocket

GPRS通用分组无线业务General Packet Radio Service的英文简称),是在现有GSM网络上开通的一种新型的分组数据传输技术。相对于原来GSM以拨号接入的电路交换数据传送方式,GPRS是分组交换技术,具有永远在线自如切换高速传输等优点,它能全面提升移动数据通信服务,使移动梦网服务更丰富、功能更强大,给您的生活和工作带来更多便捷与实惠。

GPRS(General Paeket Radio Service,通用分组无线业务)是在GSM(Global System For Mobile Conununications,全球移动通信系统)基础上发展出来的一种新的分组数据承载业务。它的基本功能是在移动终端与计算机通信网络的路由器之间提供分组传递业务。它的最大的特点是“永远在线”,因为它采用的是分组交换技术,不需要像Modem那样拨号连接,用户只有在发送或接收数据时才占用资源。GPRS另外的一个特点就是以传输资料量计费,而不是以传送时间计费,所以就算遇上网络塞车,也不会白白花钱。GPRS移动通讯业务的产生和全面投入,使它相比于传统的监控网络技术具有无可比拟的性价比优势。

本次程序设计由两大部分组成:服务器端程序和客户端程序。服务器端程序负责接收来自客户端的消息,并且根据客户端的要求把这些信息转发到另一个或多个客户中。客户端程序则负责建立和维护与服务器端的连接,向服务器发送本客户的信息内容,同时从服务器接收对方的响应。

服务器应用程序功能可以通过CSocket类提供实现。从CSocket派生出两个类:ClistenSocketCclientSocket,它们分别用来侦听客户的连接请求和建立与客户的连接。服务器只需要一个侦听套接字ClistenSocket,然后根据客户的连接请求动态创建客户套接字CclientSocket。客户端应用程序需要使用一个通过CSocket类派生出来的CchatSocket类来实现。该套接字用来发送一个与服务器的连接请求和维持与服务器的连接,发送和接收信息,完成上述各种功能。

Windows Sockets规范是一套开放的、支持多种协议的 Windows下的网络编程接口。从1991年的1.0版到1995年的2.0.8版,经过不断完善并在IntelMicrosoftSunSGIInformixNovell等公司的全力支持下,已成为 Windows网络编程的事实上的标准。一个完整的连接一定含有传输的双方,使用Winsock控件建立连接时需要考虑两方面:一个是服务器端程序,另一个则是客户端程序。服务器端是响应客房端要求的一方,它必须可以得知对方一提出连接的要求,并对此要求作出响应,接着是双方的数据交换。Socket(套接字)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。要通过互联网进行通信,你至少需要一对套接字,其中一个运行于客户机端,我们称之为ClientSocket,另一个运行于服务器端,我们称之为ServerSocket。根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。

 所谓服务器监听,是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。

 所谓客户端请求,是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

所谓连接确认,是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

一、客户端程序设计

1.1客户端应用程序功能

l  建立与服务器程序的连接

l  向服务器程序发送数据信息,接收从服务器程序回传的信息

l  关闭与服务器程序的连接

l  判断接收到的信息是否要通过串口1COM 1)发送出去

1.2客户端软件结构

为增强人机交流的友好性,使得整个操作过程简单明了,软件将采用交互式的用户界面,特选择了Visual C++ 6.0 为开发语言,主要实现数据采集、串行通信和数据处理、远程传输与控制等功能。

1.1 客户端软件结构功能图

1.3客户端软件开发环境

目前,Visual C++ 6.0 高效、简单、易学及功能强大的特点越来越为广大程序设计员所青眯。Visual C++ 6.0提供的是真正的面向对象的可视化编程方法,它的一个优点就是能迅速有效的编写程序界面,利用系统大量的可视化控件,直观地、动态地调整界面的风格和样式,从而克服了以前必须用大量代码去描述界面元素的外观和位置的传统编程模式。

Visual C++ 6.0 不但提供良好的界面设计,而且在微机串口通信方面也有很强的功能。本文中的串行通信即是运用其MSComm控件来实现的。

1.4串行通信模块设计

1.4.1 MSComm控件处理通信的方式

MSComm控件为应用程序提供了读写串口功能,它提供了两种处理通信的方法。

l  事件驱动方式:在这种情况下,使用MSComm控件的OnComm事件可以捕获和处理这些通信事件。同时,OnComm也可以捕获和处理通信中的错误。

l  查询方式:用户可以在每个重要的程序功能之后检查CommEvent属性的值来检测事件和通信错误。在通信频繁的情况下,这种方式更为方便。

1.4.2 MSComm控件常用属性

l  commport属性:这一属性设置并返回连续的串行端口号,Windows将会利用该串口和外界通信。在设计时,nnewvalue可以设置成从116的任何数(默认值为1)。但是如果用portopen属性打开一个并不存在的端口时,mscomm控件会产生错误68(设备无效)。

l  settings属性:该属性用于设置并返回数据传输速率、奇偶校验、数据比特、停止比特参数。当端口打开时,如果value非法,则mscomm控件产生错误380(非法属性值)。其中lpsznewwvalue用字符表示,用4个设置值组成,属性的组成格式为:“bbbb,p,d,s”bbbb为数据传输速率,p为奇偶校验,d为数据比特,s为停止比特。

l  handshaking属性:这一属性用于设置或者返回硬件握手协议,也就是pc和通信设备之间为了控制流速而设定的内部协议。属性值可以设置为表1.1所示的任一个。

                         1.1 handshaking属性值

      设定值

       

        描述

Comnone

0

默认值,无握手协议

comxonxoff

1

xon/xoff握手

Comrts

2

rts/cts握手

comrtsxonxoff

3

rts/ctsxon/xoff握手皆可

l  rthresholdsthreshold属性:表示在OnComm事件发生之前,接收缓冲区或发送缓冲区中可以接收的字符数。OnComm 事件用来监视和响应通信状态的变化,如果将属性的值设置为0,则OnComm事件不发生。

l  ctsholding属性:该属性确定是否可通过查询cts线的状态发送数据。cts是调制发送到相连计算机的信号,指示传输可以进行。该属性在设计时无效,在运行时为只读。

                            1.2 cts属性值

          设定值

           功能描述

Ture

cts线为高电平

False

cts线为低电平

l  inputmode属性:该属性用于设置或者返回传输数据的类型。                       

1.3 inputmode属性值

     设定值

       

       描述

cominputmodetext(缺省)

0

通过input属性以文本方式取回数据

cominputmodebinay

1

通过input属性以二进制方式取回数据

1.4.3 串口初始化

串口初始化是上位链接通信的首要任务,只有串口参数设置匹配,才能够进行通信。一般来说,串口初始化要完成以下几个设置:

● 设定通信端口号,即CommPort属性。

● 设定通信协议,即HandShaking属性。

● 设定传输速率等参数,即Settings属性。

● 设定其它参数,有必要时再加上其它的属性设定。

● 打开通信端口,即将PortOpen属性设为TURE

串口通讯首先从串口控件的初始化开始,初始化流程如图1.2所示。

1.2串口控件初始化流程图

串口初始化程序如下:

    m_ctrlCom.SetCurSel(0);//默认为COM1

    m_ctrlSpeed.SetCurSel(7);//波特率

    m_ctrlStopBits.SetCurSel(0)//;停止位

    m_ctrlParity.SetCurSel(0);//奇偶校验位

    m_ctrlDataBits.SetCurSel(0);//数据位

    m_Com=1;

    m_Speed="38400";

    m_StopBits="1";

    m_DataBits="8";

    m_Parity="n";

二、服务器端程序设计

2.1 服务器端应用程序功能

l  创建监听Socket进行监听,当有客户端请求连接时,判断用户名和密码是否正确,若正确则建立一个新的接收Socket处理这个客户的数据发送与接收;

l  接收客户端发来的数据,并向客户端返回相应信息,本程序向客户端返回信息为接收到的信息。

2.2 程序设计流程如图2.1   

                                                   2.1 服务器端开发流程

2.3 服务器端通信程序建立步骤

l  决定使用的Port号码;

l  通过网络卡及上述的Port开始侦听是否有程序提出连接要求;

l  Connection Request事件中决定是否接受(Accept)对方的连接请求;

l  Data Arrival事件中,针对要求端送来的数据作接收〔使用GetData方法)的动作,将其存在变量中作后续的处理;

l  若需要传送数据,则使用SendData方法。

2.4  Socket工作过程

套接口工作过程如下:服务器首先启动,通过调用socket()建立一个套接口,然后调用bind()将该套接口和本地网络地址联系在一起,再调用listen()使套接口做好侦听的准备,并规定它的请求队列的长度,之后就调用accept()接收连接。客户在建立套接口后就可调用connect()和服务器建立连接。连接一旦建立,客户机和服务器之间就可以通过调用read()write()来发送和接收数据。最后,待数据传送结束后,双方调用close()关闭套接口。

2.4.1 Server端建立socket并进入监听等待状态

最先被呼叫到的是WSAStartup()函数。此函数必须是应用程序呼叫Windows Sockets DLL函数中的第一个,也只有此函数呼叫成功后,才可以再呼叫其他Windows Sockets DLL的函数。此函数亦让使用者可以指定要使用的Windows Sockets API版本,及获取设计者的一些资讯。程序中的格式为:

WSAStartup(wVersionRequested, &wsaData)

然后呼叫socket()函数开启Server端的TCP Socket。此函数用来建立一个socket,并为此socket建立其所使用的资源。Socket的型态可为Stream ScocketDatagram Socket。我们要建立的是TCP socket,所以程序中第二个参数为SOCK_STREAM,将开启的这个socket号码记在m_mainSock这个变量中:

M_mainSock = socket( AF_INET,SOCK_STREAM,0 )

接下来要指定一个地址和portserver的这个socket,这样Client才知道要连接哪一个地址的哪个port,所以我们呼叫bind()函数。此函数是指定本地地址及port给某一未定名之socket。若不介意地址或port的值,则可以设定地址为INADDR_ANYport0,Windows Socket会自动将其设定为适当的地址和port(l0245000之间的值),可以在此socket真正连接完成后,呼叫getsockname()来获知其被设定的值。Bind()函数要指定地址及port,这个地址必须是执行这个程序所在机器的IP地址,所以如果在设计程序时将地址设定为INADDR_ANYWinsock系统会自动将机器正确的地址填入。如果要让程序只能在某台机器上执行,就将地址设定为该台机器的IP地址。由于此端是Server端,所以一定要指定一个port号码给这个socket。必须注意,TCP sock一旦选定了地址及port后,就无法再呼叫另一次bind来任意更改它的地址或port。程序中Server端的port指定为5000,地址则由系统来设定。

Struct sockaddr_in serverAddr;

serverAddr.sin_family = AF_INET;

serverAddr.sin_port = htons (5000);

serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);

bind(pServer->m_mainSock,(structsockaddr*)&serverAddr,sizeof(struct sockaddr));

指定port号码时用到了htons()这个函数,主要是因为各机器的数值读取方式不同(PCUNIX系统即不相同),所以利用这个函数将 host order的排列方式转换成 network order的排列方式;相同的,可以呼叫ntohs()这个相对的函数将其还原。(host order各机器不同,但 network order都相同,htons是针对short数值,对于long数值则用htonlntohl)

指定完地址和port之后,呼叫listen()函数,让这个socket进入监听状态。一个Server端的 TCP socket必须在做完了listen的呼叫后,才能接受client端的连接。此函数设定socket进入监听状态,并设定在真正完成连接前最多可有多少个彼端的连接要求。(目前最大值限制为5,最小值为l)。本程序中设为5

                    listen(pServer->m_mainSock5);

呼叫完listen后,如果此时Client端来连接的话,Client端的连接动作 (connect)会成功,不过此时Server端必须再呼叫accept()函数,才算正式完成Server端的连接动作。但是什么时候可以知道Client端来连接,而适时地呼叫accept?那就要利用一个很好用的WSAAsyncSelect函数,将Server端的这个socket转变成Asynchmnous模式,让系统主动来通知我们有Client要连接了。此函数是使用者用来要求Windows Sockets DLL在侦测到某一socket有网络事件时送信息到使用者指定的视窗;网络事件是由参数IEvent设定。呼叫此函数会主动将该socket设定为Non-blocking模式。IEvent的值可为以下组合:FD_READFD_WRITEFD_OOBFD_ACCEPTFD_CONNECTFD_CLOSE。若是针对某一socket再次呼叫此函数,会取消对该socket原先之设定。若要取消对该socket的所有设定,则IEvent的值必须设为0。我们在程序中要求Winsock系统知道Client要来连接时,送一个ASYNC_EVENT的信息到程序中hwnd这个视窗;由于想知道的只有accept事件,所以只设定FD_ACCEPT

WSAAsyncSelect(pServer->mainSock,hwnd,ASYNC_EVENT,FD_ACCEPT);

2.4.2 Server端接受Client端的连接

由于Server端的socket设定为异步模式,且针对FD_ACCEPT这个事件,所以当Client来连接时,Server端的hwnd视窗会收到Winsock State送来的一个ASYNC_EVENT信息。这时应该先利用WSAGETSELECTERROR来检查是否有错误,并由WSAGETSELECTEVENT(IParam)得知是什么事件发生(因为WSAAsyncSelect函数可针对同一个socket同时设定很多事件,但只用一个信息来代表,此处当然是FD_ACCEPT事件);然后再呼叫相关的函数来处理此事件。呼叫accept()函数来建立Server端的连接,如果Server端的socketBlocking模式,且没有连接要求,accept()函数会被Block住;如果为Non-Blocking模式,此函数会马上回复错误。accept()函数的返回值为一新的socket,此新建的socket不可再接受其它的连接要求;但原先监听的socket仍可接受其他的连接要求。

TCP socketServer端在呼叫accept()后,会传回一个新的socket号码,而这个新的socket号码才是真正与Client端相通的socket。例如,socket()建立了一个TCP socket,而此socket号码(系统给的)1,之后呼叫的bind()listen()accept()都是针对此socket;当呼叫accept()后,返回值是另一个socket号码(也是系统给的),比如说3;那么真正与Client端连接的是号码3这个socket,收送资料也都是用socket3,而不是socket1ClientIP地址和port号码由accept()函数的第二个参数传回:

SOCKET servSock;

servSock=accept(pServer->m_mainSock,(structsockaddr*)&clientAddr,&addrLen);

Server端呼叫完accept()后,主从架构的TCP socket连接才算真正建立完毕,ServerClient端就可以分别利用此socket收送资料了。

三、 系统调试

   本章叙述了本软件将实现的两个功能的模拟调试过程,经过调试,基本实现了软件的预期目标,能够通过GPRS MODEM实现主控客户端与受控客户端的消息对话以及主控客户端对受控客户端的串口控制。

系统的软硬件设计完成,并不意味着得到了一个能正常运行的系统,更为艰苦的工作仍然需要进行,那就是对设计、加工完的硬件和编写好的软件程序进行调试,测试其功能。可以肯定的是,当我们编写好一段程序后,使用编译软件的运行来启动测试终端时,总会出现这样或者那样的错误,怎样迅速发现错误所在并改正过来是调试一个程序的关键,这就需要有正确的调试方法和步骤,同时对系统进行仔细的检查。系统经过软硬件调试之后,及时发现存在问题并加以改正之后,才能使得系统内部的各个软件子程序、模块、硬件等为用户所接受。

本程序包括串口控制和消息对话功能。

受控客户端与下位机现场测试实验图3.1如下:

                            3.1 受控客户端与下位机现场测试实验图

主动客户端现场测试图如下图3.2所示:

                3.2 主动客户端现场测试图

4.1 消息对话调试

首先打开主控客户端和受控客户端登陆对话框,设置好服务器端的IP地址和端口号(服务器永远在线并且必须有独立IP),然后输入用户名和密码,按下登陆,如图3.3所示。

                                      3.3  登陆对话框

接着选择操作指令中的“消息对话”后就可以与另一客户端进行消息对话了,如图3.4所示。

                                3.4  与另一客户端进行消息对话

4.2 串口控制调试

在参数设置时,对Mscomm控件的Settings设置为Mscomm1.Settings=38400,N,8,1”,波特率为38400,无奇偶校验,8位数据位,1位停止位。控制方案设置中,选择“本地”,操作指将默认为“串口控制”。

如图4.5所示,在系统测试界面上除了以上的按钮外,还有阀口设置栏,它包括选择阀、操作指、和[打开阀口][发送数据]。当选择好任意阀门号后,按下[打开阀门]按钮后,可在操作指中选择所需的指令,这些指令包括(注水情况、系统时间、注水量设置、系统时间设置、注水参数、脉冲数设置、采样间隔设置、启动时间设置、注水长度设置),选择‘ 注水情况’、‘系统时间’和‘注水参数’指令时,上位机向下位机发送对应的指令,下位机接收到指令后,开始将存于RAM的数据顺序传送到上位机软件的接收信息框中。当选择其他参数设置指令时,令Mscomm控件的Rthreshold属性值位1,即只要外界传送任何数据进来,就产生OnComm事件,也就是上位机一个字符一个字符地接收,同时CommEvent的值变为CommEvReceive.这样就可以实现数据的连续读取。所以在数据输入框中写入欲设置的参数,按下[发送数据]按钮,下位机收到数据后同时返回参数修改结果,显示在接收信息框内。界面中的远程通信输入框栏本次设计中暂时没有用到。

    选择操作指令中的“串口控制”后就可以通过服务器端与受控客户端进行对话,从而获取下位机的数据,如图3.5所示。

                             3.5  通过服务器端传来的下位机数据

参考文献:

[1] 昊红云.移动通信前沿—GPRS技术应用 [J]. 中山大学学报(自然科学版)2003增刊(2).:136140

[2] 吕捷.GPRS技术[M].北京:北京邮电大学出版社,2001.1314.

[3] 文志成.通用分组无线业务[M].北京:电子工业出版社,2004.

[4] 钟章队,蒋文怡,李红君等. GPRS通用分组无线业务[M]. 北京:人民邮电出版社,2001.5.

[5] 求是科技 李现勇编著. Visual C++串口通信技术与工程时间[M]. 北京:人民邮电出版社,2004.7

[6] 魏朗. Visual C++程序设计攻略教程[M]. 西安电子科技大学出版社,2004.

[7] 施炜,李铮,秦颖. Windows Sockets规范及应用-Windows网络编程接口》[M].电子工业出版社,1997.

关闭页面】【页面顶部
本站所有资源未经许可不得转载复制,违者必究。
© Copyright 2012 www.zzlg.org All Right Reaserved. 漳州理工职业学院 电子与机械工程系 拥有所有版权
地址:漳州蓝田开发区鹤鸣路 电话:0596-7081785  技术支持:漳州理工职业学院