udp.c 2.51 KB
/**
******************************************************************************
* @file         udp.c                                         
* @version      V1.0                          
* @date         2018-06-18                 
* @brief        udp协议数据回环测试        
*
* @company      深圳炜世科技有限公司
* @information  WIZnet W5100S官方代理商,全程技术支持,价格价格优势大!
* @website      www.wisioe.com
* @forum        www.w5100s.com
* @qqGroup      579842114
******************************************************************************
*/
#include <stdio.h>
#include "udp.h"
#include "socket.h"
#include "wizchip_conf.h"
#include "w5100s_conf.h"
#include "bsp.h"

uint8_t UdpBuff[DATA_BUF_SIZE]= {0};  
uint16_t len = 0;

extern char UdpSendBuff[2000];
void do_udp(void)
{
	static u8 startAnalys = 0;//开始解析路径
	unsigned char buff[2000];
	unsigned int i;
  switch(getSn_SR(SOCK_UDPS))                                     // 获取socket的状态
  {
    case SOCK_CLOSED:                                             // socket处于关闭状态
      socket(SOCK_UDPS,Sn_MR_UDP,local_port,0);                   // 初始化socket
      break;    
    case SOCK_UDP:                                                // socket初始化完成
      if(getSn_IR(SOCK_UDPS) & Sn_IR_RECV)
      {
        setSn_IR(SOCK_UDPS, Sn_IR_RECV);                          // 清接收中断
      }
      if((len=getSn_RX_RSR(SOCK_UDPS))>0)                         // 接收到数据
      {
        recvfrom(SOCK_UDPS,buff, len, remote_ip,&remote_port);    // W5500接收计算机发送来的数据
				
				startAnalys = 1;				 
      }
			if(agv.Command.UdpSendFlag)
			{
				sendto(SOCK_UDPS,UdpSendBuff,strlen(UdpSendBuff), remote_ip, remote_port);     // W5500把接收到的数据发送给Remote
				
				agv.Command.UdpSendFlag = 0;
			}
      break;
  }
	if(startAnalys == 1)
	{
		agv.Command.UdpSendFlag = 0;
		startAnalys = 0;
		for(i = 0; i < len; i++)
				{
					/**解碼接收的數據**/
					if (CenterCommand.NewReceive == false)
					{
						if (CenterDecode(buff[i], &CenterCommand.CmdList) == teDecodSuccess)
						{
							CenterCommand.NewReceive = true;
						}
					}
					/**處理接收的數據**/
					if (CenterCommand.NewReceive)
					{
						if (CommandAnalysis() == 0)  //解码命令字
						{
							SendOrReplyTypeHandle();		// 命令字码处理
						}
						CenterCommand.NewReceive = false;
						//如果接收回来的数据是中控应答的,不再做处理
						if (CenterCommand.SendOrReply == sort_Receive)//判断是否是接受中控协议
						{
							Recive_check();	//取消重新发送
						}
					}
				}
	}
}