|
电脑发出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()\r\n");
#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]\r\n",s, addr[0], addr[1], addr[2], addr[3] , port, len);
printf("Fail[invalid ip,port]\r\n");
#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\r\n", IINCHIP_READ(Sn_DPORT0(s)));
// printf("destination IP : %d.%d.%d.%d\r\n", 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;
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|