问题描述
我是SAM v71的入门者,我尝试使用LWIP对SAM V71进行ping测试。但是我无法从SAM V71板上ping PC。我不知道如何进行ping测试。如果有任何链接或建议,它将有所帮助。谢谢:)。
我尝试过的步骤:
- 初始化董事会IP
- 目标IP的初始化
- 用于发送的协议是: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 (将#修改为@)