采用CH579M芯片的设备,多播UDP模式下。100M域网内,挂载200+台其它设备和本设备。经调试,当设备收到多播请求,设备应答时调用 CH57xNET_SocketUdpSendTo(...) 得到 CH57xNET_ERR_UNKNOW(未知错误)。之后设备的 多播UDP-SOCKET端将永久接收不到请求数据。断电重启本设备,重复上述问题。本设备独立组网是不会出现 CH57xNET_ERR_UNKNOW 错误 。 两种组网下ping包正常。
代码如下:
/* CH579相关定义 */ UINT8 MACAddr[6] = {0x84,0xc2,0xe4,0x02,0x03,0x04}; /* CH579MAC地址 */ UINT8 IPAddr[4] = {192,168,100,243}; /* CH579IP地址 */ UINT8 GWIPAddr[4]= {192,168,20,1}; /* CH579网关 */ UINT8 IPMask[4] = {255,255,255,0}; /* CH579子网掩码 */ const UINT8 DESIP[4] = {255,255,255,255}; UINT8 ackbuf[120]; UINT32 ablen; void CH57xNET_UdpServerRecv(struct _SCOK_INF *socinf,UINT32 ipaddr,UINT16 port,UINT8 *buf,UINT32 len) { UINT8 ip_addr[4],i; UINT8 ERR; PRINT("ipaddr=%-8x port=%-8d len=%-8d socketid=%-4d\r\n",ipaddr,port,len,socinf->SockIndex); for(i=0;i>8; } // 请求数据处理省略 ERR = CH57xNET_SocketUdpSendTo( socinf->SockIndex,ackbuf,&ablen,ip_addr,port); if (CH57xNET_ERR_SUCCESS == ERR) return; else if (CH57xNET_ERR_UNKNOW != ERR) { // 此处报 - CH57xNET_ERR_UNKNOW 未知错误 PRINT("ERROR: 0x%X \r\n",ERR); //... } else { // 其它错误 PRINT("ERROR: 0x%X \r\n",ERR); } // 错误处理todo } static UINT8 s_muludpsock; static UINT8 SocketRecvBuf[RECE_BUF_LEN]; void CH57xNET_CreatUdpSocket(void) { UINT8 i; SOCK_INF TmpSocketInf; /* 创建临时socket变量 */ memset((void *)&TmpSocketInf,0,sizeof(SOCK_INF)); /* 库内部会将此变量复制,所以最好将临时变量先全部清零 */ memcpy((void *)TmpSocketInf.IPAddr,DESIP,4); /* 设置目的IP地址 */ TmpSocketInf.DesPort = 2000; /* 设置目的端口 */ TmpSocketInf.SourPort = 2000; /* 设置源端口 */ TmpSocketInf.ProtoType = PROTO_TYPE_UDP; /* 设置socekt类型 */ TmpSocketInf.AppCallBack = CH57xNET_UdpServerRecv; /* 接收回调函数 */ TmpSocketInf.RecvStartPoint = (UINT32)SocketRecvBuf; /* 设置接收缓冲区的接收缓冲区 */ TmpSocketInf.RecvBufLen = RECE_BUF_LEN ; /* 设置接收缓冲区的接收长度 */ i = CH57xNET_SocketCreat(&SocketId,&TmpSocketInf); /* 创建socket,将返回的socket索引保存在SocketId中 */ mStopIfError(i); /* 检查错误 */ s_muludpsock = i; } int main(void) { UINT8 i = 0; GetMacAddr(MACAddr); i = CH57xNET_LibInit(IPAddr,GWIPAddr,IPMask,MACAddr); /* 库初始化 */ mStopIfError(i); /* 检查错误 */ PRINT("CH57xNETLibInit Success\r\n"); Timer0Init( 10000 ); /*初始化定时器:10ms*/ NVIC_EnableIRQ(ETH_IRQn); while ( CH57xInf.PHYStat < 2 ) { DelayMs(50); } CH57xNET_CreatUdpSocket(); /* 创建TCP Socket */ PRINT("CH579 UDP socket create!\r\n"); while(1) { CH57xNET_MainTask(); /* CH57xNET库主任务函数,需要在主循环中不断调用 */ if(CH57xNET_QueryGlobalInt())CH57xNET_HandleGlobalInt(); /* 查询中断,如果有中断,则调用全局中断处理函数 */ } }
CH57xNET_SocketUdpSendTo() 目标IP=192.168.100.112 ,PROT=6500
100网段PC一台,本设备一台,其它分20网段,10网段,30网段。