W5200响应UDP广播包,电脑端为什么接收不到响应?

2020-01-18 18:41发布

电脑发出UDP广播包,我用Debug模式在线调试,发现能接收到UDP广播包,但向发送广播包的电脑发送UDP包时,电脑端接收不到这个包。
这时的电脑IP与单片机设置的W5200的IP地址不在同一个网段中,比如电脑是172.29.143.143,W5200的IP是192.168.0.145

当把电脑的IP修改成与W5200相同的网段时,即都是192.168.0的网段,这个时候电脑就能接收到W5200发送的UDP响应。

疑问:例如海康威视的设备搜索软件,就可以搜索到不同网段的IP,我这个咋不行呢?
我查看过W5200的数据手册中UDP广播段的说明,程序就是按照上面说的来的。
数据手册中的UDP部分在附件中55页,5.2.2.1 Unicast and Broadcast节。

UDP发送代码:
uint16 sendto(SOCKET s, const uint8 * buf, uint16 len, uint8 * addr, uint16 port)
{
//        uint8 status=0;
//        uint8 isr=0;
        uint16 ret=0;
       
#ifdef __DEF_IINCHIP_DBG__
        printf("sendto() ");
#endif
   if (len > getIINCHIP_TxMAX(s)) ret = getIINCHIP_TxMAX(s); // check size not to exceed MAX size.
   else ret = len;

        if
                (
                         ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && (addr[3] == 0x00)) ||
                         ((port == 0x00)) ||(ret == 0)
                )
        {
           /* +2008.01 [bj] : added return value */
           ret = 0;
#ifdef __DEF_IINCHIP_DBG__
        printf("%d Fail[%.2x.%.2x.%.2x.%.2x, %.d, %d] ",s, addr[0], addr[1], addr[2], addr[3] , port, len);
        printf("Fail[invalid ip,port] ");
#endif
        }
        else
        {
                IINCHIP_WRITE(Sn_DIPR0(s),addr[0]);
                IINCHIP_WRITE((Sn_DIPR0(s) + 1),addr[1]);
                IINCHIP_WRITE((Sn_DIPR0(s) + 2),addr[2]);
                IINCHIP_WRITE((Sn_DIPR0(s) + 3),addr[3]);
                IINCHIP_WRITE(Sn_DPORT0(s),(uint8)((port & 0xff00) >> 8));
                IINCHIP_WRITE((Sn_DPORT0(s) + 1),(uint8)(port & 0x00ff));

//                printf("destination Port : %4d ", IINCHIP_READ(Sn_DPORT0(s)));
//                printf("destination IP : %d.%d.%d.%d ", IINCHIP_READ(Sn_DIPR0(s)), IINCHIP_READ(Sn_DIPR0(s) + 1), IINCHIP_READ(Sn_DIPR0(s) + 2), IINCHIP_READ(Sn_DIPR0(s) + 3));
                          
                          
                  // copy data
                send_data_processing(s, (uint8 *)buf, ret);
                IINCHIP_WRITE(Sn_CR(s),Sn_CR_SEND);

                /* +20071122[chungs]:wait to process the command... */
                while( IINCHIP_READ(Sn_CR(s)) )
                        ;
        }
        return ret;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
linyu0395
1楼-- · 2020-01-18 19:27
IP地址多少 好像要设置成255.255.255.255
linyu0395
2楼-- · 2020-01-18 20:55
 精彩回答 2  元偷偷看……
deyu35
3楼-- · 2020-01-19 00:12
linyu0395 发表于 2016-3-17 17:03
IP地址多少 好像要设置成255.255.255.255

电脑端发送目标IP设置的就是255.255.255.255

单片机发送函数调用:
sendto(SOCKET_UDP_CLIENT, data_buf, 47, UdpServerIP, udp_destport);
其中的UdpServerIP和udp_destport就是发出UDP包的电脑的IP和端口(读取W5200得到)

一周热门 更多>