如何进行SAM V71的Ping测试

问题描述

我是SAM v71的入门者,我尝试使用LWIP对SAM V71进行ping测试。但是我无法从SAM V71板上ping PC。我不知道如何进行ping测试。如果有任何链接或建议,它将有所帮助。谢谢:)。

我尝试过的步骤:

  1. 初始化董事会IP
  2. 目标IP的初始化
  3. 用于发送的协议是:UDP协议

代码

static void ping_prepare_echo( struct icmp_echo_hdr *iecho,u16_t len)
{
    size_t i;
    size_t data_len = len - sizeof(struct icmp_echo_hdr);

    ICMPH_TYPE_SET(iecho,ICMP_ECHO);
    ICMPH_CODE_SET(iecho,0);
    iecho->chksum = 0;
    iecho->id     = PING_ID;
    iecho->seqno  = htons(++ping_seq_num);

    /* fill the additional data buffer with some data */
    for(i = 0; i < data_len; i++) {
        ((char*)iecho)[sizeof(struct icmp_echo_hdr) + i] = (char)i;
    }

    iecho->chksum = inet_chksum(iecho,len);
}



/* Ping using the raw ip */
static u8_t ping_recv(void *arg,struct udp_pcb *pcb,struct pbuf *p,ip_addr_t *addr)
{
    struct icmp_echo_hdr *iecho;
    LWIP_UNUSED_ARG(arg);
    LWIP_UNUSED_ARG(pcb);
    LWIP_UNUSED_ARG(addr);
    LWIP_ASSERT("p != NULL",p != NULL);

    if (pbuf_header( p,-PBUF_IP_HLEN)==0) {
        iecho = (struct icmp_echo_hdr *)p->payload;

        if ((iecho->id == PING_ID) && (iecho->seqno == htons(ping_seq_num))) {
            LWIP_DEBUGF( PING_DEBUG,("ping: recv "));
            ip_addr_debug_print(PING_DEBUG,addr);
            LWIP_DEBUGF( PING_DEBUG,(" %"U32_F" ms\n",(sys_Now()-ping_time)));

            /* do some ping result processing */
            PING_RESULT(1);
            pbuf_free(p);
            return 1; /* eat the packet */
        }
    }

    return 0; /* don't eat the packet */
}

static void ping_send(struct udp_pcb *udp,ip_addr_t *addr)
{
    err_t err1;
    struct pbuf *p;
    struct icmp_echo_hdr *iecho;
    size_t ping_size = sizeof(struct icmp_echo_hdr) + PING_DATA_SIZE;
     //struct sockaddr_in to;

    LWIP_DEBUGF( PING_DEBUG,("ping: send "));
    ip_addr_debug_print(PING_DEBUG,addr);
    LWIP_DEBUGF( PING_DEBUG,("\n"));
    LWIP_ASSERT("ping_size <= 0xffff",ping_size <= 0xffff);

    p = pbuf_alloc(PBUF_IP,(u16_t)ping_size,PBUF_RAM);
    if (!p) {
        return;
    }
    if ((p->len == p->tot_len) && (p->next == NULL)) {
        iecho = (struct icmp_echo_hdr *)p->payload;

        ping_prepare_echo(iecho,(u16_t)ping_size);
        
        //lwip_sendto(p,iecho,ping_size,(struct sockaddr*)&to,sizeof(to));

        udp_sendto(pcb,p,&ip_grp,2000);
        if (err1 == ERR_MEM) {
            printf("out of mem error\n");
        }
        ping_time = sys_Now();
    }
    pbuf_free(p);
}

static void ping_timeout(void *arg)
{
    struct udp_pcb *pcb = (struct udp_pcb*)arg;
    ip_addr_t ping_target = PING_TARGET;
    
    LWIP_ASSERT("ping_timeout: no pcb given!",pcb != NULL);

    ping_send(pcb,&ping_target);

    sys_timeout(PING_DELAY,ping_timeout,pcb);
}

static void ping_udp_init(void)
{
    err_t iret;
    
    IP4_ADDR(&ip_grp,192,168,200,102);
    IP4_ADDR(&local_ip,100);
    
    ping_pcb = udp_new();
    LWIP_ASSERT("ping_pcb != NULL",ping_pcb != NULL);

    udp_bind(pcb,IP_ADDR_ANY,2000);
    udp_recv(pcb,ping_recv,NULL);  //receive data
    sys_timeout(PING_DELAY,ping_pcb);
    
    
}

void ping_send_Now()
{
    ip_addr_t ping_target = PING_TARGET;
    LWIP_ASSERT("ping_pcb != NULL",ping_pcb != NULL);
    ping_send(ping_pcb,&ping_target);
}



void ping_init(void)
{

    ping_udp_init();

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)