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

发布者:asd123yui最新更新时间:2019-05-21 来源: eefocus关键字:单片机  UIP  TCP  服务器  主动发送数据  ACK 手机看文章 扫描二维码
随时随地手机看文章

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’命令后发来的。相关代码如下所示:


关键字:单片机  UIP  TCP  服务器  主动发送数据  ACK 引用地址:单片机之UIP--TCP作为服务器,主动发送数据 ACK

上一篇:IIC之AT24C256的读写程序
下一篇:UART串口协议基础1

推荐阅读最新更新时间:2024-11-03 23:34

关于单片机串口通信波特率问题
今天学习单片机串口通信,编写了单片机与PC机的通信程序,即PC机向单片机发送信息,单片机再把信息返回给PC机,并显示出来。在调试的时候总是没有结果,检查了半天,发现错误,而且很容易被忽略的错误。用串口通信计算器在确定波特率的时候,一定要注意误差,如果过大的话(我第一次设定波特率9600,误差是6%多),通信也是有问题的,一定要把误差尽量缩小,1%以内。第二次设定波特率2400,误差1%以内。 下面是代码: /************************* * 串口通信 *************************/ #include reg52.h typedef unsigned int u16; typed
[单片机]
细说单片机晶振电路中22pf或30pf电容的作用
单片机 模拟 器件搜索 单片机原理 单片机时序 单片机分类 单片机结构分析 单片机存储器 单片机程序的完善 单片机延时程序 单片机寻址 单片机指令系统 计数器与定时器 单片机中断系统 单片机串口 单片机看门狗 单片机烧写 单片机常见问题 您当前的位置: 首页 基础知识 单片机 单片机常见问题 细说单片机晶振电路中22pf或30pf电容的作用 来源:互联网 作者: 关键字: 单片机 晶振 刚学单片机的学长告诉我单片机的晶振电路中就是用22pf或30pf的电容就行,听人劝吃饱饭吧,照着焊电路一切ok,从没想过
[单片机]
细说<font color='red'>单片机</font>晶振电路中22pf或30pf电容的作用
有关51单片机有关晶振的问题总结(干货)
在初学51单片机的时候,总是伴随很多有关于晶振的问题,其实晶振就是如同人的心脏,是血液的脉搏,把单片机的晶振问题搞明白了,51单片机的其他问题迎刃而解…… 有关51单片机有关晶振的问题一并总结出来,希望对学51的童鞋来说能有帮助。 一、为什么51单片机爱用11.0592MHZ晶振? 其一:因为它能够准确地划分成时钟频率,与UART(通用异步接收器/发送器)量常见的波特率相关。特别是较高的波特率(19600,19200),不管多么古怪的值,这些晶振都是准确,常被使用的。 其二:用11.0592晶振的原因是51单片机的定时器导致的。用51单片机的定时器做波特率发生器时,如果用11.0592Mhz的晶振,根据公式算下来需要定时器
[单片机]
循环冗余校验码的单片机及CPLD实现
    摘要: 循环冗余码校验(CRC)是一种可靠性很高的串行数据校验方法。介质循环冗余码校验的基本原理,并分别用单片机和CPLD作了循环冗余码验的软件实现和硬件实现。包括汇编语言和VHDL语言源程序。     关键词: 差错校验 查表法 CPLD 1 基本原理 串行数据的差错检验是保证数据正确的必要手段,通常采用奇遇校验法和循环冗余校验法。这两种方法都是通过冗余数据来提供必要信息。奇偶校验法适用于以字节为单位数据传输。例如用偶校验传送1个ASCII字符时,要附加1个校验位,从而使全部9位中“1”的个数为偶数。奇偶校验简单易行,但当数据崩溃或出现多位错误时,往往不能检验出来,因而可靠性不高。 循环冗余码
[应用]
基于STC51单片机的霓虹灯
设计要求:# 使用PWM驱动8个LED灯 人眼不能观察到灯光全灭 灯光要有动画效果 设计概述:# 按照设计要求,为了更直观的说明脉冲宽度调制技术(PWM),所以霓虹灯的动画效果为流水灯形式。所需要的单片机芯片为STC89C52,所用的硬件工具是由华清远见开发的基于STC89C52的智能小车。该小车配备所需要的LED灯模块,8个LED灯由P1口来控制。STC89C52是一种低功耗,高性能的8位微控制器,是加强版的80C51单片机,但是与80C51单片机一样不具备PWM硬件模块,所以我们需要自己写一个程序来软件模拟PWM方波。 PWM是一种方波,可以实现数字信号控制模拟电路,它有两个重要参数周期或频率,占空比。占空比 = 高电
[单片机]
TI 最新USB记忆棒工具方便无线MCU系统开发
灵活的低成本工具为完整的开发解决方案提供了可选独立工作模式 2007 年 9 月 25 日,北京讯 日前,德州仪器 (TI) 宣布推出一款针对嵌入式系统设计的新工具 —— eZ430-RF2500,该工具完美结合了超低功耗 MSP430微控制器 (MCU) 与无线通信功能,从而进一步简化了低功耗无线系统的开发工作。最新开发工具采用便于携带的 USB 记忆棒形式,其中包含两个支持 RF 功能的微控制器目标板与一个可用于开发独立无线项目的 PC 调试接口。开发人员将能够更加轻松地构建低功耗无线系统,满足各种创新应用的要求,如传感与计量、家庭安全与自动化以及医疗等。(更多详情,敬请访问: http://www.ti.com/ez43
[新品]
如何由单片机升级到DSP
  在过去的几十年里,单片机的广泛应用实现了简单的智能控制功能。随着信息化的进程和计算机科学与技术、信号处理理论与方法等的迅速发展,需要处理的数据量越来越大,对实时性和精度的要求越来越高,低档单片机已不再能满足要求。近年来,各种集成化的单片DSP的性能得到很大改善,软件和开发工具也越来越多,越来越好;价格却大幅度下滑,从而使得DSP器件及技术更容易使用,价格也能够为广大用户接受;越来越多的单片机用户开始选用DSP器件来提高产品性能,DSP器件取代高档单片机的时机已经成熟。   本文将从性能、价格等方面对单片机和DSP器件进行比较,在此基础上,以TI的TMS320C2XX系列DSP器件为例,探讨DSP器件取代单片机的可行性。   
[嵌入式]
英飞凌携手宝马为全新宝马M车系开发MCU
英飞凌科技股份公司近日宣布与宝马子公司宝马M股份有限公司密切合作,开发适用于全新宝马M车系的引擎控制单元。英飞凌主要负责将公司生产的微控制器芯片(MCU)集成至该系统,同时提供相应的技术支持。 全新宝马M系列引擎与前代产品一样,具备出色的性能,此外还将进一步降低燃耗,满足目前全球适用的所有汽车排放标准,包括EURO5和US-LEV2。要想实现该目标,需要采用高度创新的引擎控制装置,宝马M股份有限公司将采用来自英飞凌AUDO FUTURE产品家族的32位闪存微控制器,AUDO FUTURE系列基于英飞凌专有TriCore®处理器架构。 TriCore处理器架构在一个芯片上集成了一个微处理器、一个微控制器和一个数字信号处理器(
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved