微控制器拨号上网的实现_单片机论文
关键词:ppp 微控制器 单片机上网 调制解调器
微控制器(也称单片机)把所有常用的资源,如存储器、模数转换器、通用输入输出口、定时器等,与cpu集成在一个芯片上,具有体积小、功耗低、使用方便的特点,广泛应用于各种嵌入式系统中。随着互联网(internet)的兴起与普及,使微控制器也接入到互联网,并通过互联网传送数据。便是实现单片机与互联网通信的前提是需要在单片机上实现多种繁杂的互联网协议。而微器一般处理能力较低、程序存储器和数据存储器资源有限,这就使微控制器上网变得非常困难。目前,一般采用微控制器直接驱动网卡芯片的方案。网卡芯片封装了底层的以太网协议(如ieee802.3),微控制器只需控制网卡芯片并实现传输层与网络层协议(例如tcp、ip协议)即可以上层。但其缺点是必须应用在已经拥有局域网的地方,且网卡芯片(例如rtl8019等)价格不菲。
本文针对微控制器上网的问题,提出一种大微控制器中实现ppp协议,并通过调制解调器(modem)连接到isp(internet service provider)实现上网的解决方案:微控制器控制modem拨号连接到isp上,然后根据ppp协议(point to point protocol)进行通信协商、密码认证等握手过程,如果成功就可以通过isp上网传送数据。这种方案的优点在于:(1)可以应用于任何覆盖电话网的地区,适用于广大偏远地区;(2)硬件实现比较简单,程序比较短小;(3)只需外接电话线,安装简便。
1 硬件连接与底层驱动
微控制器拨号上网解决方案中的硬件连接非常简单,只需使用微控制器的标准串行口和i/o总线与modem相连。为了使程序更为简化,在硬件设计中可以不使用modem的硬件握手信号。最终只需四根连接线来控制modem(如图1所示):串口发送(txd)、串口接收(rxd)、载波检测cd(carrier detect)和终端准备dtr(data aerminal ready)信号。cd信号可以检测modem是处于数据传送状态还是at命令传送状态。drt信号用来通知modem传送工作已经结束。微控制器的串行口和i/o口不能直接与标准modem相连,需要使用电压转换芯片,如max232等,转换为rs232标准。
为了方便软件编程,需要针对硬件编写一些底层驱动程序。首先是串行口的驱动函数:打开串口(opencomm)、关闭串口(closecomm)、读串口数据(readcomm)、写串口数据(writecomm)等。然后在这些串口函数的基础上编写modem的驱动函数。单片机通过串行口控制modem,进行拨号、设置等操作。控制方法采用at命令,例如:atdt命令用来拨号、atv命令控制modem返回值的格式等。控制modem拨打isp的电话号码后,modem就转入在线模式(on-line),此时微控制器向串行口发送的所有数据都会直接传送给isp主机。同样isp主机的回答也传回微控制的串行口。可以说此时的modem和电话线建立了一个从微控制器到isp的透明数据连接。当数据传送完成需要断开连接时,微控制器通知modem结束会话,并从在线模式转回普通的命令模式。这可以通过置高modem的dtr线完成。同时,处于在模式下微控制器也要不断检测cd线是否处于高电平,当线路由于异常断开时,cd线会回复到平常的低电平。根据这些操作,编写modem驱动函数:(1)modem初始化函数(modeminit);(2)拨号函数(modemdial);(3)断开与isp连接(modemhangup);(4)检测modem是否处于在线状态(modemonline)等。
这些底层的驱动函数将会使上层协议的编写很方便;更重要的是,它提供了一个硬件抽象层。当底层硬件改动时,只需要对底层的驱动数改动,而上层函数的代码不变。
2 软件整体结构
2.1 软件层次结构
程序中的所有代码都由c语言编写,采用分层结构,从底到上分别为:串口驱动层、modem驱动层、ppp协议层、ip协议层、udp协议层与应用层。上层函数的实现需要应用到底层函数,而底层函数的任务就是为上层函数提供服务,最终完成应用层任务,传送数据。各层的主要函数如图2所示。
可以看出,为了尽量简化,在传输层使用了udp协议而非tcp协议。其实大多数情况下使用无线连接的udp协议已经足够,而且会使程序大幅简化。
2.2 串口接收中断的处理
为了节省代码空间,软件未使用实时操作系统,例如μc/os等,而是利用多个有了状态机来控制程序的运行。其中最重要的就是modem状态机。modem可以处在两个状态:命令状态和在线状态。当处于命令状态时,串行口接收modem的返回值。而当微控制器进行拨号命令之后,modem转而处于在线状态,此时微控制器与isp直接连接,它们之间的通信要符合ppp报文协议。因此,串行口接收的是ppp报文。在本程序中,串口使用中断接收模式,因此在串口接收中断处理函数中,首先要判断modem是处于命令状态还是在线状态。如果处于在线状态,则要按照ppp报文格式处理。找到一个完整的ppp报文后则通知主循环处理。中断处理程序的总体结构如下:
void serial0() interrupt 4 using 2
{//串行口中断处理函数
unsigned char c;
ea=0;
if(ri)
{
ri=0;
c=sbuf;//获得串口数据
if(modemstate==com)
promodemcommand(c);//处于命令状态
else
propppreceive(c);//处于在线状态,寻找完整的ppp报文
}
}
3 ppp协议的实现
ppp(point to point protocol)是数据链路层协议中的一种,是目前应用最广的一种广域网协议。ppp协议假定两个对等实体间有一个双向全双工的连接,而且数据包按顺序投递,这正好符合串行口的通信方式。ppp协议不需要差错控制、排序和流量控制,易于实现,而且支持对多种高层协议(如ip、tcp、udp)的复用。所以使用ppp拨号上网是微控制器实现internet连接的最佳选择。大部分的isp也正是通过ppp协议提供网络服务的。
ppp协议的帧结构如图3(a)所示。串口中断程序以包起始和结束符来判断是否有完整的ppp包,并对ppp包的内容进行校验以确定数据包的完整性和正确性。然后在主循环中进入ppp报文解板模块,在护号后初次与isp通信阶段,系统首先要与isp进行通信链路的协商,即协商点到点的各种链路参数配置。协商过程遵守lcp(link control protocol)、pap(password authentication protocol)和ipcp(internet protocol control protocol)等协议。其中lcp协议用于建立、构造、测试链路连接;pap协议用于处理密码验证部分;ipcp协议用于设置网络协议环境,并分配ip地址。协商机制用有限状态机模型来实现。一旦协商完成,链路已经创建,ip地址已经分配就可以按照协商的标准进行ip报文的传输了。根据应用的不同,ip报文中可以携带udp报文也可以是tcp或icmp报文。本系统正是采用udp报文传送数据的。数据传输完成后,下位机会向isp发送lcp的断开连接报文以终止网络连接。
值得注意的是,ppp报文、lcp、pap、ip报文与udp报文是互相嵌套的。即ppp报文中嵌入了ip报文和lcp、pap等报文,而ip报文中嵌入了udp报文。当ppp报文的协议符为0021时表示嵌入了ip数据报,当c021时表示嵌入lcp数据报,而为c023表示嵌入pap数据报。ppp报文的基本解析过程如图3(b)所示。
3.1 登录isp的协议协商过程
系统的难点之一是微控制器登陆isp并与iisp的协商过程,其中需要应用到lcp、pap与ipcp协议。lcp、pap与ipcp协议的帧结构大同小异,最常用的是请求(req)、同意(ack)和拒绝(nak)三种帧。微控制器与isp协商时,任何一方都可以发送req帧请求某方面的配制,另一方如果觉得配置不能接受会回应nak帧,如果可以接受则回应ack帧。为了节省资源,这里只处理这三种数据帧,其它链路问题都由微控制器在程序控制下自己重新拨号解决。各种配置选项协商好以后,ppp才可以成功登陆。
在拨号成功连接后,isp首先返回一个papreq数据帧,微控制器发送一个空lcp req帧以强迫isp进行协议协商阶段;随后isp发送lcp设置帧,微控制器拒绝所有的设置并请求验证模式。isp选择chap或pap方式验证,这里只接受pap方式。然后进行pap验证用户名和密码过程,如果成功,isp会返回ipcp报文设置ip地址。此时,就完成了与isp的协商过程,可以通过向isp发送ip报文的方式连接互联网传送数据了。协商过程的状态转换图如图4所示。
3.2 ip与udp报文的解析
协商完成后进入ip数据报通信阶段。此时,微控制器向isp发送的所有包含ip报文的ppp报文都会被isp传送给ip报文内的相应ip地址,而远端所有向微控制器ip地址发送的报文也都会经isp传送到单片机,从而完成微控制器与远程主同通过互联网的数据传输。
为了使程序尽量简化,选用ip承载udp协议发送数据。在程序中实现ip与udp报文的数据结构,向指定的主机ip地址发送udp报文较易实现。但应注意,在应用层需要用户实现自己的协议。例如对于远程读表系统,要规定仪表的数据传输协议;根据协议把相应的仪表数据放入udp报文中,传给主机;同时,主机也可以按照协议向单片机发送udp报文。可以利用udp报文的端口号,把不同的报文发送到不同的端口中以方便单片机的解析。
经过优化,本系统的软件代码可以精简到6k字节左右,共使用不到300字节的数据存储器。由于程序使用c语言编写,稍加改到就可以在各种系列的微控制器上实现。微控制器通过modem拨号上网技术,可以广泛应用于需要远程传送数据的系统中,特别适合远程秒表、远程监控等领域。