udp.c
2.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/**
******************************************************************************
* @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(); //取消重新发送
}
}
}
}
}