单片机TCP和IP(单片机tcp和计算机tcp的区别)
单片机TCP和IP
本文内容来自于互联网,分享单片机TCP和IP(单片机tcp和计算机tcp的区别)
1 概述编辑本段回目录
单片机TCP/IP就是在单片机上运行的TCP/IP协议栈。由于嵌入式联网设备越来越多,需要在嵌入式设备上实现TCP/IP协议栈,但是嵌入式设备不同于PC机,它们一般采用MCU也就是单片机而不是CPU作为核心处理器。这就需要在单片机上实现TCP/IP协议栈。对于高端的32位单片机,由于其性能已经接近于低端PC机CPU(例如奔腾II系列),所以和在PC上实现TCP/IP协议栈没有多大区别;这里主要讲述低端8位(例如51单片机)、16位单片机TCP/IP协议栈。[编辑本段]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协议栈(http://ecos.sourceware.org/getstart.html
2. ZLIP 51单片机TCP/IP协议栈(http://www.zlmcu.com/ZLIP/zlip_introduction.htm
3. uc/ip 单片机TCP/IP协议栈(http://ucip.sourceforge.net/
4. BSD 单片机TCP/IP协议栈(http://www.freebsd.org/internet.html
5. lwIP 单片机TCP/IP协议栈(http://www.sics.se/
6. uIP 单片机TCP/IP协议栈(http://www.sics.se/
7. TinyTCP 单片机TCP/IP协议栈(http://www.unusualresearch.com/tinytcp/tinytcp.htm
8. WATTCP 单片机TCP/IP协议栈(http://www.erickengelke.com/wattcp/
用户在拿到一个单片机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需要底层为其提供定时中断、网卡中断处理的入口。底层需要做相应的处理。