天天看点

STM32-GPRS模块连接系统主站

目录: 一、GPRS基础讲解(GSM/CDMA/GPRS介绍) 1、通信专业术语 2、GPRS网络结构 3、GPRS工作原理 4、GPRS协议模型 5、GPRS连接过程详解 1)MS(移动台)附着   2)PDP激活 6、GPRS的应用---TCP/IP/PPP 7、GPRS相关AT指令集 1)GPRS指令   2)TCP/IP指令   3)多路TCP/IP连接指令 二、GPRS或CDMA模块与网络连接方式 三、系统主站访问GPRS/CDMA网络中的模块 四、GPRS模块与主站通信流程 五、GPRS项目开发方案 1、主站协议 2、底层驱动部分 1)IO口初始化   2)串口初始化   3)AT指令操作   4)串口中断函数 3、主循环部分 1)TCP/IP连接流程控制   2)数据链路层数据处理   3)超时判断 --------------------------------------------------------------------------------------------------------------------- 一、GPRS基础讲解(GSM/CDMA/GPRS介绍) 1、通信专业术语

BSS--基站子系统,通过无线接口与移动台直接联系,负责在一定区域内和移动台通信。(GSM)

BTS--基站收发台,可以看作一复杂的无线调制器,BSS的主要部分,每个分配有若干信道。(GSM)

RBS--Radio Base Station,无线基站:RBS是基站内所有设备的总称,在GSM规范中对应的主要部分是BTS,它由BSC来控制,用来提供移动台与系统的无线接口,它是CME20系统中的无线设备部分,主要由无线收发信机构成。

BSC--基站控制器,其功能是作为无线电设备与MSC的控制和通信的接口,直接控制BTS。(GSM) 

GPRS--General Packet Radio Service, 通用分组无线电业务。GPRS是一种新的GSM数据业务,它可以给移动用户提供无线分组数据接入服务。GPRS主要是在移动用户和远端的数据网络(如支持TCP/IP、X.25等网络)之间提供一种连接,从而给移动用户提供高速无线IP和无线X.25业务。GPRS采用分组交换技术,它可以让多个用户共享某些固定的信道资源。如果把空中接口上的TDMA帧中的8个时隙都用来传送数据,那么数据速率最高可达164kb/s。GSM空中接口的信道资源既可以被话音占用,也可以被GPRS数据业务占用。当然在信道充足的条件下,可以把一些信道定义为GPRS专用信道。沿海部分城市已开通试营业。

GSM--Pan-European digital cellular land mobile telecommunication system ,泛欧数字蜂窝移动通信系统。1982年,欧洲邮电行政大会(CEPT)设立的"移动通信特别小组(Group Special Mobile)即GSM提出的数字蜂窝移动通信系统,其特点为用数字技术开发全欧统一的蜂窝系统以取代欧洲各种模拟蜂窝系统,后来又易名为"全球移动通信系统(Global System for Mobile Communication)。1989年制订了GSM标准;1991年GSM系统正式在欧洲问世,网路开通运行,现已在全球获得广泛应用。该系统发射频段基台为935~960MHz,移动台为890-915MHz,双工间隔45MHz,射频载波间隔200kHz,采用时分多址技术,语音编码采用规则脉冲激励长期预测编码(REP-LPC)算法;小区半径0.5~35km,频谱效率与用户容量较TACS,NMT等模拟蜂窝移动通信系统要高。我国就大部分采用此技术。1991年又更名为SMG:特别移动组。SMG1-SMG4分别对应以前的GSM1-GSM4,而SMG5是致力与GSM形成后的“通用移动电信系统”,1992年又建立了一个SMG6,负责起草运行和维护的规范。

GSN--GPRS Support Node,一个GSN是一个网络节点,它支持在GSM核心网中对GPRS的使用。所有的GSN都应当拥有一个Gn接口,并支持GPRS隧道协议。GSN有两个关键的变种,即网关(gateway)和业务(service)GPRS支撑节点。

IMEI--国际移动设备识别码。(GSM) 

IMSI--国际移动用户识别码。储存在用户的SIM卡内,和GSM系统存储器中,以便系统识别任何唯一的移动台。(GSM)

MSC--移动交换中心,应用在数字蜂窝系统中,移动用户、PSTN以及其他移动交换中和移动用户通过MTS产生联结。

SN--Serial Number的缩写,有时也叫SerialNo,也就是产品序列号,产品序列是为了验证产品的合法身份”而引入的一个概念,它是用来保障用户的正版权益,享受合法服务的。

HLR--归属位置寄存器。(GSM)

VLR--拜访位置寄存器。(GSM)

ISDN--综合业务数字网。

OPERATOR--运营者。

PDP-- Packet Data Protocol,分组数据协议,是外部PDN网与GPRS接口所用的网络协议。

PDN--Pubic Data Network,公用数据网,一种由电信运营商组建的广域网,提供接入广域网的服务与技术,为用户提供高质量数据传输服务。

PSPDN--公用分组交换数据网。

SMS--short message services--短消息业务。

SIM--用户识别码。

X.25--分组交换网内的一种通信协议。1976年批准,并多次修改,一般用于ISDN的分组交换中。包括三个层:物理层,链路层,分组层。对应于OSI模型的最低三层。

------------------------------------------------------------ 2、GPRS网络结构 ​图1 GPRS的原理结构图

    GPRS网络引入了分组交换和分组传输的概念,使得GSM网络对数据业务的支持上得到了加强,它是通过在GSM网络上增加GGSN和SGSN来实现的,GGSN和SGSN分别表示GPRS网关支持节点和GPRS服务支持节点。

    GPRS网络分为无线接入和核心网络两个部分,无线接入部分是在移动台(MS)与基站子系统(BSS)之间传输数据,核心网络在BSS与标准数据通信网边界网关之间中继传输数据。按GSM规范提出的基本结构,BSS由两个基本部分组成:通过无连接口与移动台一侧相连的基站收、发信机(BTS)和与交换机一侧相连的基站控制器(BSC)。

    GSN是GPRS网络中最重要的网络节点。GSN具有移动路由管理功能,它可以连接各种类型的数据网络,并可以连到GPRS寄存器。GSN可以完成移动台和各种数据网络之间的数据传送和格式转换。GSN可以是一种类似于路由器的独立设备,也可以与GSM中的MSC集成在一起。

    GSN有两种类型:一种为SGSN(Serving GSN,服务GSN),另一种为GGSN(Gateway GSN,网关GSN),SGSN的主要作用是记录移动台的当前位置信息,并且在移动台和GGSN之间完成移动分组数据的发送和接收。GGSN主要是起网关作用,它可以和多种不同的数据网络连接,如ISDN、PSPDN和LAN等。有的文献中,把GGSN称为GPRS路由器。GGSN可以把GSM网中的GPRS分组数据包进行协议转换,从而可以把这些分组数据包传送到远端的TCP/IP或X.25网络。

    另外,有的厂商提出了GR(GSM Register,GPRS数据库)的概念。GR类似于GSM中的HLR,是GPRS业务数据库。它可以独立存在,也可以和HLR共存,由服务器或程控交换机实现。GR这个名称在ETSI的建议中没有专门提及

------------------------------------------------------------ 3、GPRS的工作原理

    GPRS网络的工作原理体现在它的分组数据路由传输和传输协议模式上,用户通讯数据通过串行或无线方式连接到GPRS终端上,然后GPRS终端与GSM基站通信,这种方式与电路交换式数据呼叫不同,GPRS分组是从基站发送到GPRS服务支持节点(SGSN),而不是通过移动交换中心(MSC)连接到语音网络上。因此,SGSN与GPRS网关支持节点(GGSN)进行通信,GGSN对分组数据进行相应的处理后,再发送到目的网络,如Internet或X.25网络。

如图 1 所示,其具体的数据传输流程分为四步:

第一步:用户设备通过串行接口向GPRS终端传输数据;

第二步:经过处理后的GPRS分组数据发送到GSM基站;

第三步:分组数据经GSM基站的SGSN封装后,然后发送到GPRS骨干网;

第四步:在GPRS网关支持节点GGSN对SGSN分组数据进行相应的处理后,再发送到目的网络移动台(MS),和GPRS 之间的分层传输协议模型主要由GTP LLC和RLC协议构成,Um接口是GSM的空中接口,Um接口上的通信协议有 5 层,自下而上依次为物理层、MAC层、 LLC层、SNDC层和网络层,RLC/MAC为无线链路控制、媒质接入控制层,LLC层为逻辑链路控制层,GTP是将用户数据及信令用隧道技术在GPRS网络GSN节点之间传送。

------------------------------------------------------------ 4、GPRS协议模型

    Um接口是GSM的空中接口。Um接口上的通信协议有5层,自下而上依次为物理层、MAC Medium Access Control)层、LLC(Logical Link Control)层、SNDC(Sub network Dependant Convergence)层和网络层。

    Um接口的物理层为射频接口部分,而物理链路层则负责提供空中接口的各种逻辑信道。GSM空中接口的载频带宽为20OkHz,一个载频分为8个物理信道。如果8个物理信道都分配为传送GPRS数据,则原始数据速率可达20Okb/s。考虑前向纠错码的开销,则最终的数据速率可达164kb/s左右。

    MAC为媒质接入控制层。MAC的主要作用是定义和分配空中接口的GPRS逻辑信道,使得这些信道能被不同的移动台共享。GPRS的逻辑信道共有3类,分别是公共控制信道、分组业务信道和GPRS广播信道。公共控制信道用来传送数据通信的控制信令,具体又分为寻呼和应答等信道。分组业务信道用来传送分组数据。广播信道则是用来给移动台发送网络信息。

    LLC层为逻辑链路控制层。它是一种基于高速数据链路规程HDLC的无线链路协议。LLC层负责在高层SNDC层的SNDC数据单元上形成LLC地址、帧字段,从而生成完整的LLC帧。另外,LLC可以实现一点对多点的寻址和数据帧的重发控制。

    BSS中的LLR层是逻辑链路传递层。这一层负责转送MS和SGSN之间的LLC帧。LLR层对于SNDC数据单元来说是透明的,即不负责处理SNDC数据。SNDC被称为子网依赖结合层。它的主要作用是完成传送数据的分组、打包,确定TCP/IP地址和加密方式。在SNDC层,移动台和SGSN之间传送的数据被分割为一个或多个SNDC数据包单元。SNDC数据包单元生成后被放置到LLC帧内。

    网络层的协议目前主要是Phase 1阶段提供的TCP/IP和L25协议。TCP/IP和X.25协议对于传统的GSM网络设备(如BSS和NSS等设备)是透明的。

    在GPRS网络传输中,常用的有两种传输协议,即TCP和用户数据报协议UDP它们都是使用 IP 作为网络层协议,每组数据都通过端系统和每个中间路由器中的 IP层在互联网中进行传输TCP主要负责把应用程序交给它的数据分成合适的小块然后再交给下面的网络层 确认接收到的分组 设置发送最后确认分组的超时时钟等,是为两台主机提供高可靠性的数据通信。

    UDP协议与TCP协议最大的不同表现在数据传输的可靠性上,UDP协议是一种不可靠的或最尽力的协议,它本身不提供可靠的数据传输,但并不意味着在UDP协议之上就不能有可靠的数据传输 在网络传输中使用UDP协议的应用程序要负责实施重传 过滤多余信息等等 如果一个UDP包在传输过程中丢失或者损坏,需要引起发送数据的应用程序注意才行TCP协议和UDP协议各有优势,工业监控系统中究竟是采用 TCP协议还是 UDP协议,可以根据实际条件和技术水平来综合考虑。

------------------------------------------------------------ 5、GPRS连接过程详解 ​ 1)MS(移动台)附着 在此过程中,通过BSC系统的PCU模块进行接入控制和信道分配,通过SGSN和HLR进行鉴权管理,并从HLR中获得用户的签约信息,最终在MS、HLR与SGSN内部形成有关用户的移动管理信息,此时MS通过HLR系统完成鉴权,位置更新等过程,最后由HLR通过GR接口信令向SGSN发送鉴权三元组,完成附着。 当MS完成附着后,它将在RLC/MAC层使用TLLI作为身份标识,这时MS进入READY状态,并在MS和SGSN中建立起MM上下文,之后MS才可以发起PDP上下文激活过程,在这个时刻以前的所有过程的成功与否均与PDP没有关系。即是用户在附着过程中,主要涉及无线系统、如PCU、无线信道、SGSN和HLR等业务单元,而与GGSN无关。 ​ ------------------------------- 2)PDP激活 作为GPRS通信过程中第二个重要的过程,在该过程中涉及中DNS号段解析、DHCP地址分配、radius认证过程等重要过程。当PDP激活成功后,手机可以获得IP地址,系统开始形成计费话单,用户将进入通信前的临界状态。     PDP上下文包含与某个APN相关的地址映射以及路由信息。目前在我省主要的APN应用由WAP、NET以及今后的行业VPDN应用,这些特定的应用均有相对应的IP地址网段、路由信息与之相匹配。MS通过激活PDP上下文得到GGSN系统分配的动态IP地址后完成数据接入工作。所以MS能否正常从GGSN系统获得IP地址是PDP成功激活的关键所在。     DNS系统解析是否成功直接关系到PDP激活是否成功。     GPRS通信全过程包含ATTACH(附着)和PDP(激活)两个子过程。 ------------------------------------------------------------ 6、GPRS的应用---TCP/IP/PPP 实际上GPRS DTU上实现的协议栈是TCP/IP Over PPP。 1)每一次DTU拨ATD*99***1#(或ATD*99***1#)之后其实都在采用PPP协议和移动的接入设备(一般是移动公司的一台特殊的GGSN路由器)进行握手,当PPP协议握手成功后,DTU都会获得一个动态IP地址。一般来说,每一次DTU下线后(挂断连接或者直接断电后)在重新进行拨号和PPP握手后取得的动态IP地址都是不一样的。但是移动公司可以通过为客户开通特定的APN和发行特殊的SIM卡,使得用这张SIM卡获得的动态IP地址每一次都不变。也就是说可以做到SIM卡和IP地址绑定。 ------------------------------- 2)我们在做测试时,应当注意到如下事实:在采用公网的APN(“cmnet”)的条件下,如果我们用DTU主动向公网上的一个静态公网IP地址发起TCP连接,只要这个公网上的机器确实有侦听相应的端口,这样是可以连上的;但是相反地,如果是由公网上的静态IP向DTU动态获得的IP地址主动发起的TCP连接将不会成功。这个现象的原因是:实际上DTU获得的动态IP地址是移动的一个特殊的内部网段上的地址,这个特殊内部网段里的地址如果要和外部网(公网)的地址进行TCP通信,必须通过一个类似于TCP代理(或者NAT)的设备进行通信的转发。换句话说,这个动态地址对于网络上的其他机器来说是不可访问的。 ------------------------------- 3)标准AT命令+CGDCONT的主要作用是指定APN。APN是Access Point Name(访问接入点)的缩写,移动通过开通特殊的APN为行业客户提供VPN(Virtual Private Net)服务。比如说,如果是要上公网(Internet),应当使用“cmnet”作为APN。又如某企业向移动公司申请了VPN服务,移动公司为其开通了一个APN为“hxsw.gd”,则我们就应当用这个APN来设置GPRS模块,格式:AT+CGDCONT=1,“IP”,“hxsw.gd” ------------------------------- 4)确定一条TCP连接有4个要素,这4个要素是双方的IP地址和双方的TCP端口号,这也就是DTU为什么将本地端口、目的端口和目的IP地址结合起来作为连接的ID号(DTU在PPP握手成功后获得的动态地址只要不断线重连就不会改变)的原因。 ------------------------------- 5)使用TCP协议进行数据通信时,必须要经过三个阶段,第一个阶段是连接建立阶段,第二个阶段是数据收发阶段,第三个阶段是连接释放阶段。 (1)连接建立阶段 连接的建立又有主动连接和被动连接之分,一般来说客户机都是主动发起连接的,而服务器是被动接受连接的。 所谓的主动连接是指本方主动向远端发起连接请求, 而被动连接指的是本方侦听一个端口,等待远端及其主动向自己发起一个连接请求并且进行回应并且最终握手建链成功。 在连接成功切换到数据态后,我们可以通过OPEN命令帧控制DTU进行主动连接。当然,连接时要指定对方的IP地址和端口号。 ---------------- (2)数据收发阶段 当一条连接建立之后,就可以在这条连接上进行数据收发了。 可以使用SEND命令帧控制DTU进行数据发送。当然,发送时要指定连接号(通过本地端口、目的地址和端口唯一确定)。 对于对方发送过来的数据,DTU首先将其存储在自身的数据缓冲区中,然后将数据已到达此事件通知给上位机,上位机读取到数据已到达事件后,应当及时使用RECV命令帧控制DTU将相应连接上的所有数据通过串口读出,当数据读出后,这些数据原先占用的数据缓冲区空间将会被释放。注意,由于DTU的数据缓冲区有限,所以对于对方发来的数据,上位机一定要及时读出,否则数据越积越多,可能会导致数据缓冲区溢出,丢失数据。 ---------------- (3)挂断连接阶段 当一条连接上的所有数据都已经收发完成了,不再需要这条连接时,就可以把连接给挂断。 和连接建立阶段相类似,挂断也分为主动挂断和被动挂断。 可以使用RSET命令帧控制DTU进行连接的主动挂断,如果连接被对方主动挂断,DTU将会把这个事件通知给上位机进行处理。 ------------------------------------------------------------ 7、GPRS相关AT指令集 1)GPRS指令 AT+CGATT=1    //返回OK,附着网络 AT+CGACT=1,1    //激活网络,之后就可以使用TCP/IP的指令了 ------------------------------- 2)TCP/IP指令 AT+CIPSTART="TCP","121.41.97.28",60000    //连接TCP/IP服务器 AT+CIPSEND=20    //返回>,就可以输入要发送的内容20表示有20个字节 AT+CIPCLOSE    //关闭TCP/IP连接 +CIPRCV:5,12345    //收到服务器返回的5个字节 ------------------------------- 3)多路TCP/IP连接指令 AT+CGDCONT=1,"IP","cmnet"    //设置PDP参数,cmnet是APN AT+CGACT=1,1    //激活PDP AT+CIPSTATUS    //查询ip连接情况,共有8路,实际最多支持同时开4路TCP/IP连接  AT+CIPCLOSE    //关闭该链路 AT+CIPMUX    //查询是否开启多连接 AT+CIPMUX=1    //开启多链接 AT+CGPADDR    //显示PDP地址 ATD*99***1#    //请求GPRS服务 --------------------------------------------------------------------------------------------------------------------- 二、GPRS或CDMA模块与网络连接方式 1、主站系统具有公网固定IP的,内网通过端口映射收发数据。这种方式要在最前端路由器上做一个端口映射。 假如你的CDMA模块终端要连接端口是5002,把这个端口映射给数据接收中心的那台电脑上即可。 2、主站系统采用动态IP,应用DNS域名解析这种方式接收中心有路由器的话也需要端口映射。域名解析有很多软件可以用,如花生壳,金万维之类。 3、通过专线APN接入即IP对IP。GPRS比CDMA要多一种方式,点对点,移动网内可以实现点对点。 --------------------------------------------------------------------------------------------------------------------- 三、系统主站访问GPRS/CDMA网络中的模块 GPRS/CDMA模块终端运行后,会得到一个IP地址,这个地址是中国移动(GPRS)/中国联通(CDMA)内部网络地址,不能从外部(如Internet)直接访问到,此时可采用以下两种方案: 1、 移动/联通内部网均可以访问Internet,因此如果主站在Inernet上有固定IP或域名,则可以由终端首先访问主站,主站收到终端访问时记录下终端IP(与终端在GPRS/CDMA内部网的IP不同,是临时分配的,一般在几十秒到几分钟内有效),可在其有效时间内用这个IP访问终端。该方案的缺点是如果终端访问主站的间隔过短则通信费用会大大增加,如果过长则主站可能无法及时与终端通讯。如果用户的终端数量不多,或主要是终端上报数据,可采用此方案。主站也可以采取短信或电话振铃等辅助方式通知终端首先发起访问。 2、对终端数量较多的用户,应与中国移动/中国联通取得联系,为终端建立专用的APN,为主站开通专线或VPN联网,这样终端可以获得固定的IP地址,主站可以象在局域内一样与终端通讯,便于整个系统维护。 --------------------------------------------------------------------------------------------------------------------- 四、GPRS模块与主站通信流程 GPRS模块通过串口连接到ARM板,因此要进行通信首先要进行串口等初始化。 GPRS模块供电以后,SIM卡首先通过SGSN节点附在GPRS网络上(注册),然后通过PPP协议进行链接,接着GPRS网络给SIM卡分配一个动态的IP地址(网内地址)进行TCP/IP连接。 由于GPRS分配的是动态IP,所以主站的IP要固定,主站可以向移动提出申请固定IP(特殊服务,据说收费很贵),或者利用专网VPN服务。在建立连接以后,模块与上位机如何进行通信有两种协议:内部协议和外部协议。 内部协议是采用命令模式(AT指令集),外部协议采用命令模式或者数据模式。默认采用的是外部模式。可以通过AT指令设置成内部模式。因此,要与主站进行通信的流程就变的很明朗。 以芯讯通SIM7600CE-A为例,整个流程如下: 1)模块上电后初始化,初始化完毕后,会送出+pbready。如果没有收到,检查模块串口是否通; 2)检查SIM卡; 3)检查信号强度; 4)查询网络注册情况; 5)设置内部协议栈; 6)设置APN; 7)对于一些专网,若需要用户认证指令,要进行用户认证; 8)建立PPP连接; 9)查询PPP链路状况; 10)建立TCP/IP连接。 整个流程代码量不大,购买GPRS模块会附送代码参考,省下很多开发时间。    AT/r    AT+ccid/r    //检测是否装有SIM 卡    AT+cgmr/r    //检测软件版本,5.0 以上的才有GPRS 功能支持    AT+csq/r    //检测信号质量,确定是否可以登陆上网络;若返回10--31,0之间的信号数字则继续,如果信号是99,99,                       //则应该考虑不停的的让模块去搜寻网络。    AT+CGCLASS="B"/r   //设置模块工作类型    AT+CGDCONT=1,"IP","CMNET"/r   //设置PDP参数    AT+CGATT=1   //激活PDP,获得IP      AT+CIPCSGP=1,"CMNET"/r    AT+CIPSTART="TCP","10.56.12.207","2020"/r    AT+CIPSEND/r    >   //返回“>”后输入要传输的数据,再发送CTRL+Z,即将所要发送的数据发送到指定IP的服务器上 发送成功会返回SEND OK    AT+CIPCLOSE/r  //只有在TCP/UDP处于CONNECT OK的状态下才返回OK,否则返回ERROR    AT+CIPSHUT/r   //关闭移动场景 正常返回 SHUT OK --------------------------------------------------------------------------------------------------------------------- 五、GPRS项目开发方案 1、主站协议 百度网盘搜索“IHDC协议设计V1[1].4[无线模块协议]”。 ​

STM32-GPRS模块连接系统主站

STM32-GPRS模块连接系统主站

​​​​​​​

------------------------------------------------------------

2、底层驱动部分 1)IO口初始化 控制 IO 和通讯 IO,控制包括电源控制,复位和低功耗模式,通讯就是串口。在这个基础上还可以组合出复位的功能,复位在GPRS连接出错时会用到,或直接关闭模块电源再打开。 -------------------------------- 2)串口初始化 模块的波特率为115200,8位数据位,1位停止位,没有校验位和流控。 串口还需要两个发送函数,发送一个字节和发送一串字符串。串口中断处理函数放到后面说。 -------------------------------- 3)AT指令操作 发送AT指令 设置GPRS 数据长度 发送GPRS数据内容 接收GPRS数据内容 AT指令/GPRS数据解析 -------------------------------- 4)串口中断函数 包含AT指令/GPRS数据解析和接收GPRS数据内容,判断AT指令是否发送成功。 AT指令返回的结束符除了设置GPRS数据长度的是'>',其他都是"\r\n"。但是在判断接收结束的时候不能只考虑这两种情况,还有一个情况需要特殊处理,那就是当接收到GPRS数据的时候,完全有可能会出现'\r','\n'对应的十六进制数。解决的办法就是在接收到"+CIPRCV:xxx,"的时候,附带判断接收到的数据长度,"xxx"代表的是GPRS数据长度信息,字符型格式,在这里还需要做一个格式转换。数据长度的位数根据字符 ','来进行判断,',' 将AT命令和GPRS数据进行分割。"xxx"换算过来的数值决定了 ',' 后面接收到的数据长度。 由于目前采用的SIM卡模块内部没有自带缓冲区,在GPRS数据接收的时候,需要另外开辟一个存储空间用于数据的临时存储,建议采用环形缓冲区Buffer, 将串口接收到的数据按顺序存储,这个部分在串口中断函数里面实现。在大循环里面将数据取出处理,并设置相关标志位。开始设计的时候只开辟了一个非环形的缓冲区,每次接收到完整的数据,会从缓冲区的0地址重新开始存储,那么就会导致未及时处理的数据被新的数据冲掉。不知道有没有别家的SIM卡模块是自带缓冲区的。 ------------------------------------------------------------ 3、主循环部分 1)TCP/IP连接流程控制 step1:"AT\r\n"   //检测模块串口工作 step2:"AT+CCID\r\n"   //检查是否插卡 step3:"AT+CREG?\r\n"   //检查网络注册情况 step4:"AT+CGATT=1\r\n"   //附着网络 step5:"AT+CGDCONT=1,\"IP\",\"CMNET\"\r\n"   //设置PDP参数,其中CMNET是APN step6:"AT+CGACT=1,1\r\n"   //激活网络,获得IP step7: "AT+CIPSTART=\"TCP\",\"121.41.xxx.xxx\",port\r\n"   //连接TCP/IP服务器 这个模块硬件初始化差不多就要10秒,在硬件初始化完成后,按照以上7步进行服务器连接。前面两步是硬件检测用的,如果这2步都测不过,那就需要检查下硬件是否完整。3到6步如果返回ERROR,可重复发送,直至返回OK,每一步之间可间隔数秒。最后一步如果失败,需先关闭连接,再重新发起连接。如果第7步一直连接不成功,那么可以控制IO复位模块,当然也可以先确认下服务器的端口是否打开。 我的经验是连接和通讯的过程中,若出现错误的情况,复位模块是最有效和快捷的方式。在确认硬件连接正常的情况下,若多次发送命令失败,返回ERROR的话,那还是复位模块吧。 另外两个AT命令也很好用 "AT+CIPCLOSE\r\n"   //关闭TCP/IP连接 "ATE0\r\n"   //关闭回显,关闭自己发给模块的串口数据,调试的时候可以不开启这个功能,方便观察。 -------------------------------- 2)数据链路层数据处理 实现GPRS数据接收/发送控制,存储串口中断接收到的数据,发送GPRS数据长度和GPRS数据内容。 这个函数里面需要注意的是发送GPRS长度和数据的操作,需要在一次操作流程里面完成。我一开始脑残的将GPRS数据长度和数据发送分开处理,导致设置完数据长度后,发送状态处于准备好的状态,此时只要检测到有数据是需要发送的,便会通过GPRS发送出去,而无法保证是当前数据长度对应的数据帧(我在这里一共开辟了8个数据缓存,但是没有对发送状态进行分开判断)。在设置完数据长度后,需要判断是否接收到字符'>',大概需要50毫秒的时间。一开始分开发送也是和这个'>'字符的操作有关的,我已经帮大家试过了,连在一起发就好了。 发送完GPRS长度帧后,返回字符'>',接着发送数据帧,在模块返回"OK"之前,发送的数据都会被发送到服务器,导致通讯出错。所以在数据发送后,需要等待判断模块是否已经发送成功。 -------------------------------- 3)超时判断 检测GPRS数据是否发送失败,失败后可关闭TCP/IP连接,进行重连,如果还是失败,可复位模块,重新进行TCP/IP连接流程。 ---------------------------------------------------------------------------------------------------------------------