单片机TCP/IP

ZLMCU网

摘要:本文结合作者使用单片机TCP/IP的经验为广大单片机TCP/IP技术的爱好者提供一个抛砖引入的作用,文章从TCP/IP讲到了单片机TCP/IP的特点,针对这些特点在单片机上实现TCP/IP最好使用现有的TCP/IP协议栈,接着本文列出了8个常见的单片机TCP/IP协议栈。最后介绍了如何使用这些单片机TCP/IP协议栈实现用户所需的单片机上网项目的需求。

关键词:单片机;TCP/IP;协议栈;

1  TCP/IP简介

TCP/IP指传输控制协议/网际协议 (Transmission Control Protocol / Internet Protocol)。在互联网发展的今天,TCP/IP协议栈实际上已经成为网际互连的代名词。TCP/IP协议栈并不符合ISO的7层模型结构,它分为4层即:

1.  应用层:它是根据应用的不同编写的不同的协议,例如超文本传输协议( HTTP)、简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。

2.  传输层:传输层负责数据在点与点之间的正确传送,保证数据包的顺序和数据的正确,一般来说主要指面向连接的传输控制协议(TCP),有时面向非连接的用户数据报协议(UDP)也包括在这里。

3.  互连网络层:也就是IP协议,它负责数据报如何在网络之间传递,例如选择路由等。

4.  网络接口层:由于网络物理介质的不同,需要选择不同的管理方式,例如以太网(Ethernet)和通过Modem上网的方式需要不同的管理方法。

2    单片机TCP/IP的特点

在单片机上实现TCP/IP与在PC机上实现TCP/IP是有所不同的,参考《TCP/IP在51单片机上的实现特点和方法》我们可以了解到:

1.  速度慢:根据该文档的介绍12M的51单片机的最快网络传送速度为25KB/s。其中的关键在于TCP/IP需要对传送的每个字节进行校验和计算,以及必要的拷贝。这样51单片机的处理速度就不够了。为了提高单片机TCP/IP的速度一般的方法是要对协议栈进行精简。

2.  程序存储空间和外部RAM空间不大:一般的单片机的最大程序和数据空间为64KB。TCP/IP协议一般需要对发送的数据进行缓存,而一个最大的数据包就有1500B,当网络速度很大的时候内存消耗将很大。对于非嵌入式TCP/IP协议栈,64KB的程序和数据空间是完全不够的。

3.  编译器:实际上和51单片机的体系结构有关,因为它是8位机,所以对于需要完成同一个数据操作,32位的PC机可能只需要10条指令,而51单片机可能需要几百条。

3    已有的单片机TCP/IP协议栈

       由于TCP协议栈的程序流程较为复杂,因为程序中需要处理对方法送过来的数据、发起的连接,而我方并不知道对方会何时进行什么样的操作,这就使得协议处理起来较为复杂。另外一个原因是单片机TCP/IP协议栈的稳定性是以非常重要的问题,一个稳定的协议栈需要在实际应用中经过长时间的测试,所以编写一个稳定的单片机TCP/IP协议栈更加困难。为此另外一种选择就是使用现有的TCP/IP协议栈。

1.  eCos单片机TCP/IP协议栈eCos TCP/IP栈是涉及与eCos操作系统/内核一起运行的。eCos(和TCP/IP栈)由大量处理其结构支持。eCos TCP/IP栈当前发布了一个测试版,作为一个单独的模块。

2.  ZLIP 51单片机TCP/IP协议栈ZLIP是专门为51单片机设计的嵌入式TCP/IP协议栈,可以在有操作系统和没有操作系统情况下运行,具有代码量适中、运行速度快、用户接口简单、兼容BSD socket接口的特点。实现了TCP、UDP、ICMP、ARP协议,ZLWeb实现了HTTP协议。支持多TCP连接、多UDP连接同时运行,支持在uc/os-II操作系统下多任务运行数据收发。可以用于51单片机TCP/IP上网解决方案。

3.  uc/ip 单片机TCP/IP协议栈:uC/IP(mew-kip)是为为控制其设计的一个TCP/IP协议栈。代码基于BSD(很像所有其它栈)但对非常小的覆盖范围功能有所减少。它当前为Linux和DOS目标而建。

4.  BSD 单片机TCP/IP协议栈BSD栈历史上是其他商业栈的开始点,大多数专业TCP/IP栈(如带Wind-River VxWorks内核的)是BSD栈派生的。这是因为BSD在BSD许可协议下提供了他们的栈,它们的许用证使你能以修改或未修改的形式结合它们的代码而无须向创建者付版税。与GPL许用证相比,如果你结合GPL源代码,后者要求你的GPL中公开你的源代码。

5.  lwIP 单片机TCP/IP协议栈lwIP(轻型)TCP/IP栈是TCP/IP协议栈的一个小型实现。它包括带IP和ICMP的TCP和UDP传输层。还提供一个可选的BSD套结籽API。为了性能,还包括一个零拷贝API。LwIP协议栈是为嵌入式系统设计的并能适合40KB的ROM和几百字节的RAM。为了可移植性它用C编写。

6.  uIP 单片机TCP/IP协议栈uIP是专门为8位和16单片机设计的一个非常小的TCP/IP协议栈。uIP完全用C编写,以此可以移植到各种不同的结构和操作系统上。一个编译的栈可以有几KB ROM或几百字节RAM中运行。uIP还包括一个HTTP服务器作为服务内容。

7.  TinyTCP 单片机TCP/IP协议栈:TinyTCP栈是TCP/IP的一个非常小的简单的实现,它包括一个FTP客户。TinyTCP是为烧入ROM设计的并且现在开始对大端结构似乎是有用的(初始目标是68000芯片)。TinyTCP也包括一个简单的以太网驱动器用于3Com多总线卡。

8.  WATTCP 单片机TCP/IP协议栈:WATTCP是为嵌入基于DOS的系统而设计的一个小型TCP/IP栈。它包括一个Real Mode DOS版本和另一个32位扩展环境版本。

4    如何使用单片机TCP/IP协议栈

       用户在拿到一个单片机TCP/IP协议栈以后该如何处理呢。其中的处理分为两个部分:上层接口和下层接口。

4. 1 上层接口

       用户使用单片机TCP/IP的目的实际非常明了,就是要实现数据的传送,即从PC机(或者另一个单片机)上传送过来的数据能够在本地单片机上接收,反之亦然。所以如果屏蔽底层的话,单片机TCP/IP协议栈就是一个传输数据的手段。所以最后归结到了使用send()、recv()函数即可。这就是使用单片机TCP/IP协议栈的核心所在。

       但是事实上并没有这么简单,因为对于TCP需要有发起连接、接受连接、发送数据、接收数据、关闭连接等操作以配合数据的传输。TCP/IP协议栈一般为用户提供如下的接口:

1.  初始化协议栈和释放协议栈的函数接口,类似Init(), Release()之类的函数。

2.  提供类似BSD socket的socket, sendto, recvfro, connect, bind, listen, accept, send, recv, closesocket, shutdown, getpeername, getsockname, htonl, htons, ntohl, ntohs, inet_addr,inet_ntoa,ioctlsocket,setsockopt, getsockopt,select等API函数,用户调用此类函数进行发起连接、接受连接、发送数据、接收数据、关闭连接等操作。

3.  接受连接、接收数据、被动关闭的处理:由于此类操作是上位机发起的,所以TCP/IP协议栈必须提供一套机制来处理此类事件的发生。一般来说有两种方法:

a)         主动等待:例如使用BSD的recv()函数等待数据的到来。

b)        回调机制:采用类似MFC的OnReceive()函数的回调机制,也即是说在接收到数据的时候会自动调用OnReceive()函数。

那么用户如何使用以上的接口来实现远程控制、远程数据采集呢?方法很简单。

例如现在需要实现一个对LED灯的亮和灭的远程控制应用。首先PC机使用TCP/IP发送工具例如SocketDlgTest程序发送一个字节的“1”到开发板(根据开发板的IP地址发送)。开发板在OnReceive函数中发现收到的是“1”,那么就通过P1端口将灯打开;反之如果收到的是“0”则将灯熄灭。

如果是实现一个远程数据采集的应用,例如定时进行温度采集。首先PC机使用SocketDlgTest程序等待发来数据。开发板每隔一段时间采集一个数据,然后通过send()函数将数据发送给PC机(根据PC机的IP地址发送),这样PC就接收到了当前的远程温度数据。

4. 1 下层接口

下层接口是一个比较复杂的部分,实际上是TCP/IP协议栈和底层硬件的对接问题。如果用户将TCP/IP协议栈移植到自己的单片机系统上。由于硬件上存在一定的差异,就需要修改底层代码。这里需要包括:

1.网卡驱动:如果TCP/IP协议栈已经提供了网卡驱动,并且驱动和用户使用的网卡芯片一样,那么就相对容易一些。这里只需要修改网卡的基地址即可。否则需要自己动手写驱动程序。如果网卡采用RTL8019AS可以参考老古开发网的单片机与TCP/IP网络。如果网卡采用CS8900,可以参考《嵌入式 TCP/IP 协议单片机技术在网络通信中的应用

2.TCP/IP底层接口。一般单片机TCP/IP需要底层为其提供定时中断、网卡中断处理的入口。底层需要做相应的处理。