求教调用 CH57xNET_SocketUdpSendTo() 返回 未知错误产生的原因,以及应该如何避免。

采用CH579M芯片的设备,多播UDP模式下。100M域网内,挂载200+台其它设备和本设备。经调试,当设备收到多播请求,设备应答时调用 CH57xNET_SocketUdpSendTo(...)  得到 CH57xNET_ERR_UNKNOW(未知错误)。之后设备的 多播UDP-SOCKET端将永久接收不到请求数据。断电重启本设备,重复上述问题。本设备独立组网是不会出现 CH57xNET_ERR_UNKNOW 错误 。 两种组网下ping包正常。

112233.png223311png.png

代码如下:

/* 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网段。

123456.png



麻烦请提供一下不同组网下主要节点的IP信息和CH57xNET_SocketUdpSendTo()的目标IP信息。从您的说法中,整个网络的带宽还足够,芯片的还有足够的处理能力,与CH57xNET_SocketUdpSendTo()特定函数调用相关。


100网段PC一台,本设备一台,其它分20网段,10网段,30网段。123456.png


CH57xNET_SocketUdpSendTo() 目标IP=192.168.100.112 ,PROT=6500


这个有解决吗,我是配置了组播,第一次发送消息到设备,设备应答报错:250,再发消息给设备就可以正常应答了;

过一段时间再发又出现报错:250,再发消息给设备也是可以正常应答;

而且每次报错,就进TCP超时,也没用TCP

    if(initstat & SINT_STAT_TIM_OUT)                                            /* TCP超时中断 */

    {                                                                           /* 产生此中断,CH579库内部会将此socket清除,置为关闭*/

        PRINT("TCP Timout\n");                                                  /* 应用曾需可以重新创建连接 */

    }

感觉很奇怪,像是第一次要先唤醒设备一样?


只有登录才能回复,可以选择微信账号登录