`

单片机之UIP--TCP作为服务器,主动发送数据 ACK

 
阅读更多

作者:LZMCSDN: http://blog.csdn.net/kaly_liu

邮箱:kaly.liu@163.com

uip下的TCP作为服务器,主动发送数据===最近弄这个,在网上找资料好累,而且都是含糊不清的讲述,没有实例的,我实在是受不了了,好不容易弄好了一个,现在来分享下。

1.添加STC12C5A单片机的引脚定义:在reg52.h里面:sfr P4=0xC0;

2.修改对应引脚,按照电路图修改,SPI接口采用单片机IO口模拟,只需根据实际的硬件电路设计(IO口需要上/下拉电阻),在spi.h文件中修改IO脚定义即可,需要注意的是ENC28J60采用SPI0模式,即时钟信号上升沿接收数据,下降沿发送数据,本例中SPI通讯时序已经调通,可以直接使用,至少要接SCK,CS,SI,SO即可,INT没有使用,可以不接,如果接上,ENC28J60驱动代码已经开启了接收中断,程序中可以接收到,但在使用中断模式时,请考虑收,发包的同步情况,比如:网卡支持全双工模式,正在发送包时,又收到一个包产生中断,而uIP协议栈是共用缓存的(为节约内存),如果再次去调用协议栈,会将协议栈缓存出错。


3.添加串口中断,在MCU_UART.C中修改init_uart()函数,开启串口中断

4.在main.c中添加中断voiduart(void) interrupt 4

为了把串口接收到的数据先保存在缓存中,需要先设置一个数组temp[64]来临时存储数据,接收到数据字节数rxnum,以及接收完成标志sendtotcpflag;

从串口接收数据是一个字节一个字节的接收,所以要接收到完整的数据后再处理,就需要有一个标志,表示全部接收完毕了,然后再处理。这里我利用在数据前后加入‘*’和‘#’分别作为开始和结束的标志,单有这两个符号出现后sendtotcpflag就会自加一;在程序中判断sendtotcpflag为2时候,就表示数据接收完毕了,就进入数据处理函数,处理收到的数据。有个地方要注意的是:我直接用:SBUF==’*’来做判断,不行,不知道为什么一定要用到temp[rxnum]作为中间量后,使用temp[rxnum]==’*’才可以作为判断。

 

5.实现串口发送数据到TCP客户端。

单片机先接受串口数据,然后通过TCP服务器发送数据到PC机的客户端。在 uIP中,主动发送数据有两个方法:

1)用uip_input:当检测到新的数据时,调用uip_input(),把接收到的IP包解包,然后提取出用户数据,然后调用app_call,在app_call中调用uip_send()或者uip_udp_send()来发送数据。

2)用uip_periodic(),即在主循环超时仍没有接收到新数据时,调用 uip_periodic(),像uip_input那样在其里面调用app_call,再调用uip_send()或者uip_udp_send()来发送数据。

在程序中,使用的是第一种方法,只有当服务器检测到新数据时,服务器才可以发送数据到客户端。在example0.c文件的example0_app()函数中,添加程序:

在if(uip_newdata()|| uip_rexmit())中添加一个if(sendtotcpflag>2)的判断执行程序,代码如下:

具体操作流程如下:

首先,将设备连接完善,串口,网线连接好;

第二步,打开串口、网络调试助手;

第三步,开启设备,并将网络调试助手连接上服务器;设置好TCP客户端的端口号以及IP号:端口PORT: 8000 IP: 192.168.1.13

第四步,在串口输入要发送的数据“*xxxxx#”;

第五步,网络调试助手客户端发送随意数据到服务器;

第六步,就看到刚才的串口数据从服务器发送到客户端了。

 

6.服务器的IP与端口设置以及MAC地址设置,IP与MAC地址设置在uipopt.h文件里(设置的是静态的);端口在tcp_server.c里。

另外可以利用函数来设置IP和mac地址,修改在uipopt.h文件里的UIP_FIXEDADDR的值:

#define UIP_FIXEDADDR 0 //1 为1时MCU设置为静态IP。当UIP_ FIXEDADDR为0时可以利用函数设置IP(建议使用)。可以在main.c中添加如下函数,当然首先要在mian()里定义个数组:u16_t ipaddr[2];

 

最终实现的是:首先串口发送数据,但是不会直接发到TCP客户端,只会保存在单片机中;然后TCP客户端发送数据到单片机,当单片机接收到数据后,就会将串口数据发送到TCP客户端。

 

20130426进行改进中:

7.修改5中的内容,实现功能TCP客户端发送命令‘C’到TCP服务器,TCP服务器收到此数据,认为此时需要从串口发送数据到TCP客户端。在TCP客户端收到’C’后,就进入一段上限长达30S的延时,串口需要在时间限制内发送一段数据。当TCP服务器收到数据(数据时以‘*’和‘#’为开始和结束标志)后,串口数据接收标志sendtotcpflag值就为2了,此时满足跳出延时的条件,程序便从循环的延时中break出来,将从串口收到的数据发送到TCP客户端。代码中的senddataflag是用来标记串口数据的来源的,为了确保串口数据是在TCP服务器接收到‘C’命令后发来的。具体的代码修改如下:

为了保证串口数据是在TCP服务器接收到‘C’命令后发来的,在main中需要进行判断,当senddataflag的值为0的时候,说明了此时的串口数据不是需要的,因此此时任何串口数据都不要保存在temp[]中,需要将temp[]清零。而当senddataflag的值为10的时候,说明此时是所需要的串口数据,即串口数据是在TCP服务器收到了TCP客户端发来的‘C’命令后发来的。相关代码如下所示:

本程序已上传到资源中,连接在我的评论里面。http://download.csdn.net/detail/kaly_liu/5312012

 

 

作者:LZMCSDN: http://blog.csdn.net/kaly_liu

邮箱:kaly.liu@163.com

 

 

分享到:
评论

相关推荐

    uip_TCP服务器

    http://blog.csdn.net/kaly_liu uip下的TCP作为服务器,主动发送数据” 这个描述指出,更详细的信息可以在指定的博客中找到。作者Kaly_Liu在CSDN(Chinese Software Developer Network)上分享了关于如何利用uIP...

    uIP-1.0源码

    uIP-1.0源码 uIP is a very small implementation of the TCP/IP stack that is written by Adam Dunkels <adam@sics.se>. More information can be obtained at the uIP homepage at http://www.sics.se/~adam/uip...

    uip-0.9源码

    理解`uip-0.9`源码可以帮助开发者深入理解TCP/IP协议栈的工作原理,这对于开发低功耗、低资源的网络应用非常有用。要学习和使用这个源码,你需要具备以下技能: - C语言基础:因为UIP是用C语言编写的,所以熟悉...

    移植uip-1.0协议栈制作Web服务器

    本例程移植uIP-1.0协议栈,实现了一个简单的Web服务器。

    uip-1.0原代码

    作为一款跨平台的协议栈,uIP-1.0应该考虑了多种硬件和操作系统环境的兼容性,提供了一套标准化的编译配置和移植指南。 通过分析uIP-1.0的源代码,我们可以深入理解如何在有限的资源下实现一个功能完备的TCP/IP...

    uip-1.0.rar

    《深入理解嵌入式TCP/IP协议栈:以uip-1.0为例》 在现代电子设备和物联网系统中,网络通信是不可或缺的部分,而TCP/IP协议栈则是实现这一功能的核心技术。本篇文章将深入探讨嵌入式环境下的TCP/IP协议栈,特别以...

    uip-1.0.tar.tar

    《嵌入式TCP/IP协议栈解析——以"uip-1.0.tar.tar"为例》 在信息技术领域,网络通信是不可或缺的一部分,而TCP/IP协议栈则是实现网络通信的基础架构。本文将深入探讨嵌入式环境下的TCP/IP协议栈,并以"uip-1.0.tar....

    uip-uip-1-0.tar.gz_6lowpan_免费看uip影视

    标题中的“uip-uip-1-0.tar.gz”是一个典型的源代码压缩包文件名,表明这包含了某个软件项目的源代码,使用了Unix/Linux下的tar工具进行打包,并使用gzip进行了压缩。"6lowpan"是IPv6在低功耗个人区域网络(Low-...

    uip-0.6-中文说明

    uIP-0.6作为一款针对嵌入式系统的精简型TCP/IP协议栈,其设计理念、架构模式以及应用场景均展现出了独特的魅力。无论是对于资源受限的微控制器,还是对于追求高性能、低功耗的物联网设备,uIP都是一款值得深入研究与...

    uip-0.9版本

    **标题:“uIP-0.9版本”** **一、uIP介绍** uIP是一个微型TCP/IP协议栈,由瑞典计算机科学学院的网络嵌入式系统小组的Adam Dunkels开发。这个项目的主要目标是为资源有限的嵌入式设备提供一个轻量级的TCP/IP协议...

    Web_uIP--DM9000

    Web_uIP--DM9000 是一个与网络通信相关的项目,主要涉及到两个核心组件:Web服务器uIP和DM9000网络控制器。在这个项目中,uIP是一个微型的TCP/IP协议栈,用于在资源有限的嵌入式系统中实现网络功能,而DM9000则是一...

    uIP-1.0源码.rar

    《深入解析uIP-1.0源码》 uIP是一个轻量级的TCP/IP协议栈,由瑞典乌普萨拉大学的Ludwig Schmidt和Adam Dunkels开发,设计目标是为微控制器和嵌入式系统提供网络连接能力。uIP-1.0源码的分析,将帮助我们理解其在...

    STM32使用uip实现dhcp,dns,tcp与udp并行发送数据;

    并行发送数据意味着STM32可以在同一时间处理多个TCP和UDP连接。这需要UIP协议栈有效地管理不同连接的状态,同时调度网络中断处理,以确保数据的并发传输。 在开发过程中,我们可能需要编写C代码来处理UIP的事件,如...

    移植uip-1.0到Atmega32+ENC28J60及其.rar

    《移植uIP-1.0到Atmega32+ENC28J60及其仿真》 在物联网领域,微控制器与网络接口芯片的结合是实现嵌入式设备联网的关键。本项目聚焦于将uIP-1.0协议栈移植到Atmega32微控制器,并配合ENC28J60以太网控制器,实现一...

    UIP-1.0代码移植

    **UIP-1.0代码移植** 在嵌入式系统设计中,往往需要将软件从一个平台移植到另一个平台,以适应不同的硬件环境。UIP(Micro IP)是一个轻量级的TCP/IP协议栈,特别适合资源有限的8位到16位处理器。它的主要特点是...

    uip+tcp_client+tcp_server

    在TCP/IP通信中,客户端首先通过SYN-SYN-ACK的三次握手建立连接,然后可以发送数据。服务器则在监听特定端口,一旦接收到客户端的连接请求,就会响应并建立连接。一旦连接建立,双方都可以通过TCP套接字发送和接收...

    STC系列C51单片机使用uip协议栈主动向Web服务器提交HTTP请求

    STC系列C51单片机使用uip1.0协议栈主动向向Web服务器提交HTTP请求。 本UIP协议为本人亲自移植,绝对可以使用。 单片机:STC12C5A60S2 1T C51单片机 协议栈:UIP1.0 支持主动连接其他网络设备,不需要使用定时器,...

    uIP-一个嵌入式TCP/IP源代码

    一个嵌入式TCP/IP源代码,非常适合资源有限的嵌入式系统使用。

Global site tag (gtag.js) - Google Analytics