📄 21ic 微控制器拨号上网的实现.htm
字号:
style="TEXT-INDENT: 30px">为了方便软件编程,需要针对硬件编写一些底层驱动程序。首先是串行口的驱动函数:打开串口(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)等。</P>
<P
style="TEXT-INDENT: 30px">这些底层的驱动函数将会使上层协议的编写很方便;更重要的是,它提供了一个硬件抽象层。当底层硬件改动时,只需要对底层的驱动数改动,而上层函数的代码不变。<BR><IMG
height=223 hspace=10 src="21IC 微控制器拨号上网的实现.files/20b.gif" width=549
vspace=10 border=0><BR><B>2 软件整体结构</B></P>
<P style="TEXT-INDENT: 30px">2.1 软件层次结构</P>
<P
style="TEXT-INDENT: 30px">程序中的所有代码都由C语言编写,采用分层结构,从底到上分别为:串口驱动层、MODEM驱动层、PPP协议层、IP协议层、UDP协议层与应用层。上层函数的实现需要应用到底层函数,而底层函数的任务就是为上层函数提供服务,最终完成应用层任务,传送数据。各层的主要函数如图2所示。</P>
<P
style="TEXT-INDENT: 30px">可以看出,为了尽量简化,在传输层使用了UDP协议而非TCP协议。其实大多数情况下使用无线连接的UDP协议已经足够,而且会使程序大幅简化。</P>
<P style="TEXT-INDENT: 30px">2.2 串口接收中断的处理</P>
<P style="TEXT-INDENT: 30px">为了节省代码空间,软件未使用实时操作系统,例如<FONT
face=Arial>μC/OS</FONT>等,而是利用多个有了状态机来控制程序的运行。其中最重要的就是MODEM状态机。MODEM可以处在两个状态:命令状态和在线状态。当处于命令状态时,串行口接收MODEM的返回值信息。而当微控制器进行拨号命令之后,MODEM转而处于在线状态,此时微控制器与ISP直接连接,它们之间的通信要符合PPP报文协议。因此,串行口接收的是PPP报文。在本程序中,串口使用中断接收模式,因此在串口接收中断处理函数中,首先要判断MODEM是处于命令状态还是在线状态。如果处于在线状态,则要按照PPP报文格式处理。找到一个完整的PPP报文后则通知主循环处理。中断处理程序的总体结构如下:</P>
<P style="TEXT-INDENT: 30px">void serial0() interrupt 4 using 2</P>
<P style="TEXT-INDENT: 30px">{//串行口中断处理函数</P>
<P style="TEXT-INDENT: 30px">unsigned char c;</P>
<P style="TEXT-INDENT: 30px">EA=0;</P>
<P style="TEXT-INDENT: 30px">if(RI)</P>
<P style="TEXT-INDENT: 30px">{</P>
<P style="TEXT-INDENT: 30px">RI=0;</P>
<P style="TEXT-INDENT: 30px">c=SBUF;//获得串口数据</P>
<P style="TEXT-INDENT: 30px">if(ModemState==COM)</P>
<P style="TEXT-INDENT: 30px">ProModemCommand(c);//处于命令状态</P>
<P style="TEXT-INDENT: 30px">Else</P>
<P
style="TEXT-INDENT: 30px">ProPPPReceive(c);//处于在线状态,寻找完整的PPP报文</P>
<P style="TEXT-INDENT: 30px">}</P>
<P style="TEXT-INDENT: 30px">}<B><BR><IMG height=277 hspace=10
src="21IC 微控制器拨号上网的实现.files/20c.gif" width=549 vspace=10
border=0><BR>3 PPP协议的实现</B></P>
<P style="TEXT-INDENT: 30px">PPP(Point to Point
Protocol)是数据链路层协议中的一种,是目前应用最广的一种广域网协议。PPP协议假定两个对等实体间有一个双向全双工的连接,而且数据包按顺序投递,这正好符合串行口的通信方式。PPP协议不需要差错控制、排序和流量控制,易于实现,而且支持对多种高层协议(如IP、TCP、UDP)的复用。所以使用PPP拨号上网是微控制器实现Internet连接的最佳选择。大部分的ISP也正是通过PPP协议提供网络服务的。</P>
<P
style="TEXT-INDENT: 30px">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的断开连接报文以终止网络连接。</P>
<P
style="TEXT-INDENT: 30px">值得注意的是,PPP报文、LCP、PAP、IP报文与UDP报文是互相嵌套的。即PPP报文中嵌入了IP报文和LCP、PAP等报文,而IP报文中嵌入了UDP报文。当PPP报文的协议符为0021时表示嵌入了IP数据报,当C021时表示嵌入LCP数据报,而为C023表示嵌入PAP数据报。PPP报文的基本解析过程如图3(b)所示。</P>
<P style="TEXT-INDENT: 30px">3.1 登录ISP的协议协商过程</P>
<P
style="TEXT-INDENT: 30px">系统的难点之一是微控制器登陆ISP并与IISP的协商过程,其中需要应用到LCP、PAP与IPCP协议。LCP、PAP与IPCP协议的帧结构大同小异,最常用的是请求(REQ)、同意(ACK)和拒绝(NAK)三种帧。微控制器与ISP协商时,任何一方都可以发送REQ帧请求某方面的配制,另一方如果觉得配置不能接受会回应NAK帧,如果可以接受则回应ACK帧。为了节省资源,这里只处理这三种数据帧,其它链路问题都由微控制器在程序控制下自己重新拨号解决。各种配置选项协商好以后,PPP才可以成功登陆。</P>
<P
style="TEXT-INDENT: 30px">在拨号成功连接后,ISP首先返回一个PAPREQ数据帧,微控制器发送一个空LCP
REQ帧以强迫ISP进行协议协商阶段;随后ISP发送LCP设置帧,微控制器拒绝所有的设置并请求验证模式。ISP选择CHAP或PAP方式验证,这里只接受PAP方式。然后进行PAP验证用户名和密码过程,如果成功,ISP会返回IPCP报文设置IP地址。此时,就完成了与ISP的协商过程,可以通过向ISP发送IP报文的方式连接互联网传送数据了。协商过程的状态转换图如图4所示。<BR><IMG
height=258 hspace=10 src="21IC 微控制器拨号上网的实现.files/20d.gif" width=549
vspace=10 border=0><BR> <SPAN class=main1>3.2
IP与UDP报文的解析</P>
<P
style="TEXT-INDENT: 30px">协商完成后进入IP数据报通信阶段。此时,微控制器向ISP发送的所有包含IP报文的PPP报文都会被ISP传送给IP报文内的相应IP地址,而远端所有向微控制器IP地址发送的报文也都会经ISP传送到单片机,从而完成微控制器与远程主同通过互联网的数据传输。</P>
<P
style="TEXT-INDENT: 30px">为了使程序尽量简化,选用IP承载UDP协议发送数据。在程序中实现IP与UDP报文的数据结构,向指定的主机IP地址发送UDP报文较易实现。但应注意,在应用层需要用户实现自己的协议。例如对于远程读表系统,要规定仪表的数据传输协议;根据协议把相应的仪表数据放入UDP报文中,传给主机;同时,主机也可以按照协议向单片机发送UDP报文。可以利用UDP报文的端口号,把不同的报文发送到不同的端口中以方便单片机的解析。 </P>
<P
style="TEXT-INDENT: 30px">经过优化,本系统的软件代码可以精简到6K字节左右,共使用不到300字节的数据存储器。由于程序使用C语言编写,稍加改到就可以在各种系列的微控制器上实现。微控制器通过MODEM拨号上网技术,可以广泛应用于需要远程传送数据的系统中,特别适合远程秒表、远程监控等领域。
</SPAN></P>
<P></P></DIV></TD></TR>
<TR>
<TD align=middle height=15>
<TABLE cellSpacing=0 cellPadding=0 align=center border=0>
<TBODY>
<TR>
<TD>
<DIV></DIV></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD align=right height=2>
<TABLE cellSpacing=0 cellPadding=0 width="80%" border=0>
<TBODY>
<TR>
<TD width=75>【<A href="javascript:doPrint();">打印本稿</A>】</TD>
<TD width=8></TD>
<TD width=75>
<P>【<A
href="http://www.21ic.com/new_info/news/review.asp?title=微控制器拨号上网的实现target="
_blank?>发表评论</A>】</P></TD>
<TD width=10></TD>
<TD width=79>【<A
href="http://www.21ic.com/new_info/news/sendmail.asp?num=微控制器拨号上网的实现">推荐</A>】</TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD align=right height=2></TD></TR>
<TR>
<TD align=right height=2><A href="javascript:window.close();"><IMG
height=20 src="21IC 微控制器拨号上网的实现.files/close_c.gif" width=77 border=0
name=Image161></A><FONT
color=#ffffff>----</FONT></TD></TR></TBODY></TABLE><BR><BR>
<TABLE cellSpacing=0 cellPadding=0 width=520 align=center border=0>
<TBODY>
<TR>
<TD vAlign=bottom align=middle width=114 bgColor=#999a76
height=1><IMG height=1 src="21IC 微控制器拨号上网的实现.files/blank.gif"
width=1></TD>
<TD width=466 height=1></TD></TR>
<TR>
<TD align=middle width=114 bgColor=#ece8db height=19>相关新闻</TD>
<TD width=466 height=19></TD></TR>
<TR bgColor=#999a76>
<TD colSpan=2 height=1><IMG height=1
src="21IC 微控制器拨号上网的实现.files/blank.gif" width=1></TD></TR>
<TR>
<TD colSpan=2 height=1></TD></TR></TBODY></TABLE>
<TABLE borderColor=#000000 cellSpacing=0 cellPadding=0 width=520
align=center border=0>
<TBODY>
<TR>
<TD vAlign=top>
<TABLE class=RelatedTable width="100%" border=0>
<TBODY>
<TR class=RelatedTr>
<TD class=RelatedTd>
<SCRIPT language=javascript
src="21IC 微控制器拨号上网的实现.files/about.htm"></SCRIPT>
</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR></TD>
<TD vAlign=top align=middle width=150 bgColor=#ece8db height=2>
<TABLE cellSpacing=0 cellPadding=1 width="100%" border=0>
<TBODY>
<TR>
<TD bgColor=#000000>
<TABLE cellSpacing=0 cellPadding=2 width=150 bgColor=#ece8db
border=0>
<TBODY>
<TR>
<TD><!--#include file="../../adinc/a_ad_3.asp"--></TD></TR>
<TR>
<TD
height=5></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=766 align=center border=0>
<TBODY>
<TR>
<TD vAlign=top colSpan=6></TD></TR>
<TR>
<TD vAlign=top colSpan=6 height=10></TD></TR>
<TR>
<TD vAlign=top bgColor=#999999 colSpan=6 height=2></TD></TR>
<TR>
<TD class=stxt vAlign=center align=middle colSpan=6
height=6></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=766 align=center border=0>
<TBODY>
<TR>
<TD class=s width=973 height=12></TD></TR>
<TR>
<TD class=s width=973 height=20>
<DIV align=center><FONT face="Arial, Helvetica, sans-serif"><!--#include file="../../../../inc/copy.inc"--></FONT></DIV></TD></TR></TBODY></TABLE><BR></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -