微控制器拨号上网的实现
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)所示。
《微控制器拨号上网的实现(第2页)》