1 嵌入式TCP/IP通信系统
目前,工业控制领域典型的80C51嵌入式TCP/IP通信系统,主要有两种硬件方案,(1)采用80C51+网卡芯片,在单片机中实现TCP/IP协议并接入Internet;(2)采用固化TCP/IP协议的硬件芯片自动解析协议,实现Internet接入,后者程序已固化在硬件中,一般难以通过软件方法提高通信速率,因此,主要分析提高前一种方案的通信速率,其接口电路如图1所示。
图1 RTL8019AS与51单片机的接口电路
由于单片机中断资源有限,嵌人式系统与以太网通信主要采用的是软件查询方式,而不是中断响应方式,从以太网上传来的数据会先存至芯片上16 kB的数据缓存区,当单片机空闲时,通过对8019芯片标志寄存器的查询,来确认是否有数据到来,并进行接收。
嵌入式TCP/IP协议的实现方法尚无统一标准,往往是设计人员根据具体工程的实际需要,结合TCP/IP规范进行裁减的,目前,虽然针对80C51单片机的开源嵌入式TCP/IP代码的实现方式有多种多样,但大致遵循TCP/IP层次(链路层、网络层、传输层、应用层)进行开发,TCP协议是TCP/IP协议簇的核心,是最复杂的协议,其独特的自动检错和重发机制,实现了数据的可靠通信,但是,嵌入式系统对TCP协议进行较大裁减,若设计不当,会严重影响通信速率。
2 影响通信速率的因素
以80C51单片机数据采集系统(图2)为例进行分析,图2中:上位机为装有Windows操作系统的PC机,下位机为单片机,由于51单片机处理速度和内存资源的局限,目前大部分开源TCP通信的处理流程,如图3所示,图3中发送数据的部分表示发送一次TCP数据包。由于嵌入式IP协议没有分组功能,为了符合网络MTU的限制,在设计中最好在嵌入式TCP层进行分包处理,即在TCP层将所要发送的数据按网络MTU进行分包,然后交给IP层直接发送,如此循环往复,这种简单的TCP通信方式在低速小数据包中的应用是足够的,然而,一旦采集速度变高,数据量增大,就无法满足应用要求。
图2 单片机数据采集系统
造成上述通信速率低下的原因是:上位机不是收到数据就直接发送确认,而是继续等待下一个数据包,而出现这种延时确认的情况,是为了解决Internet上出现所谓的“糊涂窗口综合症”问题,RFC(Request for Comments)申明,TCP发送端必须实现Nagle算法,并推荐TCP接收端使用延时确认算法。
Nagle算法要求TCP连接上最多只能有一个未被确认的分包,在该分包的确认到达之前不能发送其他的小分包;而接收端延时确认算法,允许接收端接收到一个数据包后不立即进行确认,而是经过一段延时(一般为200 ms)后再发送该数据包的确认包,因此,在嵌入式TCP/IP通信系统中会经常触发上位机延时确认算法,而下位机在没收到确认之前是不能发送数据的,这对高速交互的采样系统而言,将产生明显的时延,降低TCP通信效率。[page]
一个以太网数据包最大字节数是1.5 kB,扣除各个包头信息所占的字节数,真正有效的数据在1 kB左右,如果发送端每次都等接收端发出确认后再发送下一个数据包,那么在1 S内,发送端的发送次数为5次,总的发送数据量为5 kB。
图3 嵌入式TCP通信流程
3 提高TCP通信速率的方法
采用以下两种方案,可以消除或减小延时确认的时间,达到提高嵌入式TCP/IP通信速率的目的。
(1)修改上位机Nagle算法的延时确认时间,这种方案虽然可以直接关闭TCP的Nagle算法,不再受到未确认TCP包数量的限制,但对于数据包较小的情况会产生大量的分组,浪费大量的系统和网络资源,产生“糊涂窗口综合症”。
在实际应用中,修改上位机的Nagle算法延时时间比关闭算法更可行,即通过修改Windows操作系统在注册表表项TCPDelAckTicks的值(HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interface\
(2)修改下位机TCP协议程序,虽然通过修改Nagle算法的设置来提高单片机通信速率的方法较为简单,但实际应用中却有诸多不便,例如,当TCP通信端口采用公用服务如HTTP的80端口时,修改该端口的延时确认时间必然影响正常的HTTP服务,而且对于每台上位都要手动进行修改,比较麻烦,所以对于大数据量的TCP传输,直接修改单片机TCP层的代码更合理。
在实际操作中,可以采用类似滑动窗口的算法改变TCP发送流程来提高速率,滑动窗口控制机制在上位机的TCP/IP协议中是很普遍的,但在下位机,为了简化设计往往忽略了该功能,采用类似滑动窗口的机制,只要设计得当,将强迫上位机发送确认消息。
具体算法有如下4个发送步骤。
(1)将应用层要发送的数据按以太网MTU划分为1 kB的大小分包。
(2)由于每个分包有1 kB,因此,将TCP层发送窗口大小设计为2 kB的倍数,如图4所示,考虑到实际中上位机TCP缓存窗口都不大,Windows操作系统一般只有几千到几万字节,所以将窗口直接设计为2 kB大小。
(3)连续发送两个分包后,发送窗口变为零,发送端就停止发送,等待确认。
(4)接到确认后,窗口设置为2,并重新开始步骤(2)。
上述发送步骤似乎与图3并无太大不同,但由于连续发送了两个TCP数据包,根据Nagle算法,TCP连接上只能有一个未确认的数据包,上位机在接收到两个数据包后,已经超过算法规定的未确认包数,因而要立刻发送针对这两个数据包的确认消息,这里需要注意的是:嵌入式TCP/IP的分包是在TCP层进行而不是在IP层进行,所以发送的两个TCP包到达上位机后不会在IP层被重组为一个包,上位机的TCP层才会马上进行确认。
图4 TCP层窗口控制发送流程
在数据量较大的情况下,采用这样的方式来提高TCP通信速率,既不用修改上位机的TCP协议程序,又具有了部分滑动窗口控制的优点,使得数据流可靠地传输,经实验,在相同的数据量(4 MB)下,经过修改的嵌入式TCP层通信速率在局域网中,可达到40~50 kB·S-1,是未修改前的10倍。
4 结束语
采用嵌入式TCP/IP技术的仪器具有组网灵活、成本低和通信距离远等优点,在需要高速传送大量数据的嵌入式系统中,上述两种方案可较好地满足嵌入式TCP通信中速率较慢的问题,在此基础上,可实现以文件为单位如HTTP,FTP等的传输服务,工作参数均达到项目要求,具有较好的实用性。
上一篇:8255单独控制步进电机
下一篇:简易信号发生器源程序
推荐阅读最新更新时间:2024-03-16 13:52