微控制器拨号上网的实现
扫描二维码
随时随地手机看文章
微控制器(也称单片机)把所有常用的资源,如存储器、模数转换器、通用输入输出口、定时器等,与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 Terminal Ready)信号。CD信号可以检测MODEM是处于数据传送状态还是AT命令传送状态。DTR信号用来通知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所示。
?{//串行口中断处理函数
unsigned char c;?
EA = 0;?
if(RI)
?{
RI = 0;?
c = SBUF;?//获得串口数据
if(ModemState == COM)
ProModemCommand(c);//处于命令状态
else
ProPPPReceive(c);//处于在线状态,寻找完整
的PPP报文
? }
?}
值得注意的是,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并与ISP的协商过程,其中需要应用到LCP、PAP与IPCP协议。LCP、PAP与IPCP协议的帧结构大同小异,最常用的是请求(REQ)、同意(ACK)和拒绝(NAK)三种帧。微控制器与ISP协商时,任何一方都可以发送REQ帧请求某方面的配制,另一方如果觉得配置不能接受会回应NAK帧,如果可以接受则回应ACK帧。为了节省资源,这里只处理这三种数据帧,其它链路问题都由微控制器在程序控制下自己重新拨号解决。各种配置选项协商好以后,PPP才可以成功登陆。
在拨号成功连接后,ISP首先返回一个PAP REQ数据帧,微控制器发送一个空LCP REQ帧以强迫ISP进行协议协商阶段;随后ISP发送LCP设置帧,微控制器拒绝所有的设置并请求验证模式。ISP选择CHAP或PAP方式验证,这里只接受PAP方式。然后进行PAP验证用户名和密码过程,如果成功,ISP会返回IPCP报文设置IP地址。此时,就完成了与ISP的协商过程,可以通过向ISP发送IP报文的方式连接互联网传送数据了。协商过程的状态转换图如图4所示。