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成功。

相关连接:

本章例程链接

相关推荐
WIZnet 中国社区官方博客24 天前
第五章 GPIO示例
程序设计·wiznet·高性能以太网单片机·w55mh32·单片机外设·寄存器描述·gpio介绍
WIZnet 中国社区官方博客25 天前
【第二十三章 IAP】
嵌入式硬件·wiznet·高性能以太网单片机·w55mh32·单片机外设·iap简介·iap程序设计
WIZnet 中国社区官方博客1 个月前
第二章 开发板与芯片介绍
嵌入式硬件·wiznet·高性能以太网单片机·w55mh32·系统框架·开发板介绍·硬件资源
WIZnet 中国社区官方博客1 个月前
第十三章 RTC 实时时钟
嵌入式硬件·wiznet·高性能以太网单片机·w55mh32·单片机外设·rtc简介·寄存器描述
WIZnet 中国社区官方博客1 个月前
第二十章 BKP
wiznet·高性能以太网单片机·w55mh32·单片机外设·bkp简介·bkp特性·rtc校准
WIZnet 中国社区官方博客1 个月前
第十六章 I2C
嵌入式硬件·wiznet·高性能以太网单片机·w55mh32·单片机外设·i2c通讯·i2c主从模式
WIZnet1 个月前
第二十八章 RTC——实时时钟
嵌入式硬件·时间戳·wiznet·高性能以太网单片机·w55mh32·rtc实时时钟·时钟分频
WIZnet2 个月前
第十九章 ADC——电压采集
嵌入式硬件·wiznet·高性能以太网单片机·w55mh32·adc电压采集·adc模数转换·嵌入式学习教程
邓校长的编程课堂7 个月前
基于树莓派Pico和声音传感器实现声控风扇的技术分享
物联网·嵌入式开发·树莓派pico·编程入门·c++编程·声音传感器·c++趣味编程
邓校长的编程课堂7 个月前
c++编程&玩转物联网:使用芯片控制8个LED实现流水灯技术分享
c++·物联网·嵌入式开发·树莓派pico·led流水灯·位操作·c++编程实践