W5500-EVB-PICO主动PING主机IP检测连通性(十)

前言

上一章我们用W5500_EVB_PICO 开发板做UDP组播数据回环测试,那么本章我们进行W5500_EVB_PICO Ping的测试。

什么是PING?

Ping (Packet Internet Groper)是一种因特网包探索器,用于测试网络连接量的程序 。Ping是工作在 TCP/IP网络体系结构中应用层的一个服务命令, 主要是向特定的目的主机发送 ICMP(Internet Control Message Protocol 因特网报文控制协议)Echo 请求报文,测试目的站是否可达及了解其有关状态。

连接方式

使开发板和我们的电脑处于同一网段:

  • 开发板(设备)通过交叉线直连主机(PC)
  • 开发板和主机都接在路由器LAN口

测试工具

  • 串口调试工具(任意)

测试

1.相关代码

我们打开例程中库文件的w5500_ping.c文件我们先找到ping.c头文件下面看下,可以看到几个函数,我们需要用到如下所示几个函数:Ping_auto要我们传入一个socket端口号和需要Ping的对象IP信息;函数里面用一个Switch状态机,对socket端口状态轮询并进行相应的处理,当状态在SOCK_IPRAW,就开始Ping的工作,成功则返回Ping的信息,Ping失败则打印失败的信息。

cpp 复制代码
void ping_auto(uint8_t s, uint8_t *addr)
{
    uint8_t i;
    int32_t len = 0;
    uint8_t cnt=0;
    for(i = 0; i<=3;i++)                                                                        
    {
        sleep_ms(10); 
        switch(getSn_SR(s))                                                                     
        {
            case SOCK_CLOSED:                                                                       
                close(s);
                IINCHIP_WRITE(Sn_PROTO(s), IPPROTO_ICMP);           
                if(socket(s,Sn_MR_IPRAW,3000,0)!=0)                                 
                { }
                while(getSn_SR(s)!=SOCK_IPRAW);
                sleep_ms(1000);                                                                         
                sleep_ms(1000);                                                                         
            break;
                
            case SOCK_IPRAW:                                                                        
                ping_request(s, addr);                                                          
                req++;
                while(1)
                {
                    if ( (len = getSn_RX_RSR(s) ) > 0)
                    {
                        ping_reply(s, addr, len);                                               
                        sleep_ms(50);                                                                   
                        rep++;
                        break;
                    }
                    else if(cnt > 200)
                    {
                        printf( "Request Time out. \r\n");
                        cnt = 0;
                        break;
                    }
                    else
                    {
                        cnt++;
                        sleep_ms(50);                                                                   /*wait 50ms*/
                    }
                    // wait_time for 2 seconds, Break on fail
                }
    
            break;
            default:
            break;
        }
            #ifdef PING_DEBUG
        if(rep!=0)
        {
            printf("Ping Request = %d, PING_Reply = %d\r\n",req,rep);
            if(rep == req)
                printf( "PING SUCCESS\r\n " );
            else
                printf( "REPLY_ERROR\r\n " );
        }   
    else{}      
            #endif  
    }

}

主函数还是和之前一样,先配置好网络信息,然后配置好所要Ping的IP,添加do_ping()函数来执行Ping_auto函数,并将do_ping放在while循环中运行。

cpp 复制代码
#define SOCKET_ID 0
#define ETHERNET_BUF_MAX_SIZE (1024 * 2)

void do_ping(void);
void network_init(void);
wiz_NetInfo net_info = {
    .mac = {0x00, 0x08, 0xdc, 0x16, 0xed, 0x2e},
    .ip = {192, 168, 1, 10},
    .sn = {255, 255, 255, 0},
    .gw = {192, 168, 1, 1},
    .dns = {8, 8, 8, 8},
    .dhcp = NETINFO_STATIC};
wiz_NetInfo get_info;
static uint8_t ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {0,};
static uint8_t destip[4]={192, 168, 1, 1};
static uint16_t destport = 8080;
static uint16_t local_port =8000;
int main()                                                          
{   
    stdio_init_all();
    sleep_ms(2000);
    network_init();

    while(true)
    {
        // loopback_udpc(SOCKET_ID, ethernet_buf, destip, destport);
        do_ping();
        if(req>=4)
        {
            close(0);                                   
            break;
        }        
    }
    
}

void network_init(void)
{
    uint8_t temp;
    wizchip_initialize();
    printf("W5500 ping test.\r\n");
    sleep_ms(2000);
    wizchip_setnetinfo(&net_info);
    print_network_information(get_info);
    sleep_ms(2000);   
}
void do_ping(void)
{    
    printf("------------PING_TEST_START-----------------------\r\n");
    sleep_ms(1000); // wait 1000ms
    ping_auto(0,destip);
}

2.烧录现象

我们编译烧录后,打开串行监视器,按下复位键,会打印网络配置信息和所要Ping的ip当Ping成功后串口会打印Ping的信息,出现PING SUCCESS 表示Ping成功。

相关连接:

本章例程链接

相关推荐
邓校长的编程课堂10 小时前
基于树莓派Pico和声音传感器实现声控风扇的技术分享
物联网·嵌入式开发·树莓派pico·编程入门·c++编程·声音传感器·c++趣味编程
邓校长的编程课堂23 天前
c++编程&玩转物联网:使用芯片控制8个LED实现流水灯技术分享
c++·物联网·嵌入式开发·树莓派pico·led流水灯·位操作·c++编程实践
邓校长的编程课堂24 天前
C++零基础入门:基于树莓派Pico的趣味编程体验
嵌入式开发·树莓派pico·c++编程·信息学奥赛·零基础入门·hello world·编程教育
邓校长的编程课堂1 个月前
c++趣味编程&玩转物联网:树莓派Pico控制 LED点阵屏
物联网·嵌入式开发·树莓派pico·少儿编程·stem教育·c++编程实践·图案动态显示
邓校长的编程课堂1 个月前
C++编程&玩转物联网:用树莓派Pico点亮RGB彩灯世界
嵌入式开发·树莓派pico·c++编程·随机数应用·rgb led·pwm技术·stem教育
WIZnet1 个月前
W55RP20芯片介绍
树莓派·wiznet·w55rp20
WIZnet2 个月前
W55RP20-EVB-Pico评估板介绍
单片机·嵌入式硬件·wiznet·w55rp20·以太网开发板
哦豁灬3 个月前
树莓派pico上手
单片机·嵌入式硬件·micropython·树莓派pico
WIZnet1 年前
W5500-EVB-Pico评估版介绍
wiznet·w5500·rp2040·w5500-evb-pico
WIZnet1 年前
三十一、W5100S/W5500+RP2040树莓派Pico<TCP_Server多路socket>
wiznet·树莓派rp2040·w5100s/w5500·嵌入式硬件接入以太网方案·多路socket 开启tcp