硬件资料
工程下载
实现步骤
W5500的UDP建立过程也是非常方便的,通过简单的读写寄存器便可以轻松实现。程序初始化完成以后,进入主循环函数。当Socket处于关闭状态时,在进行通信之前,我们先将该UDP模式的Socket端口初始化。当socket将处于 初始化完成状态即SOCK_UDP状态,此时就可以通过广播方式发送数据了。在测试之前要注意两个问题,首先建议关闭PC的防火墙;其次,若W5500模块与PC直接通过网线连接,需要修改PC的IP地址为静态IP,且保持与W5500的IP在 同一个网段。
UDP通信流程图如下:
UDP代码如下:
void do_udp()
{
switch(getSn_SR(0)) // 获取socket0的状态
{
case SOCK_UDP: // Socket处于初始化完成(打开)状态
Delay_ms(100);
if(getSn_IR(0) & Sn_IR_RECV)
{
setSn_IR(0, Sn_IR_RECV); // Sn_IR的RECV位置1
}
// 数据回环测试程序:数据从远程上位机发给W5500,W5500接收到数据后再回给远程上位机
if((len=getSn_RX_RSR(0))>0)
{
memset(buffer,0,len+1);
recvfrom(0,buffer, len, remote_ip,&remote_port); // W5500接收来自远程上位机的数据,并通过SPI发送给MCU
printf("%s\r\n",buffer); // 串口打印接收到的数据
sendto(0,buffer,len, remote_ip, remote_port); // 接收到数据后再回给远程上位机,完成数据回环
//memset(buffer,0,sizeof(buffer));
}
// W5500从串口发数据给客户端程序,数据需以回车结束
if(USART_RX_STA & 0x8000) // 判断串口数据是否接收完成
{
len=USART_RX_STA & 0x3fff; // 获取串口接收到数据的长度
sendto(0,USART_RX_BUF,len,remote_ip, remote_port); // W5500向客户端发送数据
USART_RX_STA=0; // 串口接收状态标志位清0
memset(USART_RX_BUF,0,len+1); // 串口接收缓存清0
}
break;
case SOCK_CLOSED: // Socket处于关闭状态
socket(0,Sn_MR_UDP,local_port,0); // 打开Socket0,并配置为UDP模式,打开一个本地端口
break;
}
}
测试步骤
- 对代码进行编译,之后将程序烧录到W5500EVB开发板。
- 连接好网线,USB串口线。打开串口调试工具,复位W5500EVB开发板,从输出结果可以得到图1设置信息。
- 如图1所示,设置W5500EVB的IP为192.168.1.150,Port为5000;网络调试工具设置为计算机的端口5000,点击“Open”。
- 此时就可以通过发送数据进行通信测试了,通信效果如图3所示。这就说明W5500已经迅速通过UDP实现了数据的收发。
图1:UDP初始化信息
图2:通信测试