单片机TCP/IP是在单片机上运行的TCP/IP协议栈。 由于嵌入式网络设备越来越多,需要在嵌入式设备上实现TCP/IP协议栈,但嵌入式设备与PC不同,通常采用MCU (即单片机)而不是CPU作为核心处理器这需要在单片机上实现TCP/IP协议栈。 对于高端32位单片机,由于其性能已接近低端PC的CPU (如奔腾ii系列),与在PC上实现TCP/IP协议栈没有太大区别; 本文主要描述低端的8位(例如,51位)、16位单片机TCP/IP协议栈。
中文名称
单片机TCP/IP
外语名称
danpianjiTCP/IP
特长
程序存储区域和外部RAM区域没有什么特征
速度慢
协议栈
eCos单片机TCP/IP协议栈
协议栈
ZLIP51单片机TCP/IP协议栈
单片机TCP/IP单片机TCP/IP的特点
编辑
语音
在单片机上实现TCP/IP和在PC上实现TCP/IP是不同的。 参照《TCP/IP1单片机上的实现特点和方法》,可以看出其特征如下。
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单片机
单片机TCP/IP现有单片机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协议栈,可以在有操作系统的情况下运行实现了TCP、UDP、ICMP、ARP协议,ZLWeb实现了HTTP协议。 支持同时运行多TCP连接、多UDP连接,支持在uc/os-II操作系统上通过多任务发送和接收数据。 可用于51单片机TCP/IP互联网解决方案。
3. uc/ip单片机TCP/IP协议栈3360UC/IP(Mew-kip )是一种旨在对其进行控制的TCP/IP协议栈。 代码基于BSD,但与所有其他堆栈相似。 但是,非常小的覆盖功能正在减少。 目前为Linux和DOS目标构建。
4. BSD单片机TCP/IP协议栈: BSD栈历史上是其他业务栈的起点,有很多专门的TCP/IP栈,如带Wind-River VxWorks内核的这是因为BSD在BSD许可协议下提供了他们的堆栈。 这些许可证允许您以修改或未修改的形式合并代码,而无需向作者支付特许权使用费。 与GPL许可证相比,合并GPL源代码时,后者要求GPL公开源代码。
5. lwIP单片机TCP/IP协议栈: lwIP (轻量级) TCP/IP栈是TCP/IP协议栈的小型实现。 包括具有IP和ICMP的TCP和UDP传输层。 还提供了可选的BSD插座API。 为了性能,还包括qkdcg。 LwIP协议栈是为嵌入式系统设计的,适用于40KB的ROM和数百字节的RAM。 为了可移植性,用c写的。
6. uIP单片机TCP/IP协议栈: uIP是专门为8位和16单片机设计的非常小的TCP/IP协议栈。 uIP完全用c编写,可以移植到各种结构和操作系统中。 编译的堆栈可以在几千字节rom或几百字节的RAM上运行。 uIP还包括HTTP服务器作为服务内容。
7. TinyTCP单片机TCP/IP协议栈: TinyTCP栈是TCP/IP非常小的简单实现,包括FTP客户。 TinyTCP旨在烤ROM,似乎对大端结构很有用(初始目标是68000芯片)。 TinyTCP还包括用于3Com多总线卡的简单以太网驱动器。
8. WATTCP单片机TCP/I
P协议栈:WATTCP是为嵌入基于DOS的系统而设计的一个小型TCP/IP栈。它包括一个Real Mode DOS版本和另一个32位扩展环境版本。
单片机TCP/IP如何使用单片机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需要底层为其提供定时中断、网卡中断处理的入口。底层需要做相应的处理。