电脑发出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;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
电脑端发送目标IP设置的就是255.255.255.255
单片机发送函数调用:
sendto(SOCKET_UDP_CLIENT, data_buf, 47, UdpServerIP, udp_destport);
其中的UdpServerIP和udp_destport就是发出UDP包的电脑的IP和端口(读取W5200得到)
一周热门 更多>