WCH沁恒单片机
直播中

lotusp

11年用户 1174经验值
擅长:电源/新能源
私信 关注
[问答]

调用CH57xNET_SocketUdpSendTo() 返回出现未知错误是什么原因?

采用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
",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
",ERR);        //...    }    else { // 其它错误        PRINT("ERROR: 0x%X
",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
");    Timer0Init( 10000 );                                                /*初始化定时器:10ms*/NVIC_EnableIRQ(ETH_IRQn);while ( CH57xInf.PHYStat < 2 ) {DelayMs(50);}    CH57xNET_CreatUdpSocket();                                                  /* 创建TCP Socket */    PRINT("CH579 UDP socket create!
");       while(1)    {        CH57xNET_MainTask();                                                    /* CH57xNET库主任务函数,需要在主循环中不断调用 */        if(CH57xNET_QueryGlobalInt())CH57xNET_HandleGlobalInt();                /* 查询中断,如果有中断,则调用全局中断处理函数 */    }}

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


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





回帖(4)

张润

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

何夏庄

2022-8-2 09:38:46
100网段PC一台,本设备一台,其它分20网段,10网段,30网段。
举报

李微波

2022-8-2 09:38:50
CH57xNET_SocketUdpSendTo() 目标IP=192.168.100.112 ,PROT=6500
举报

张雯雯

2022-8-2 09:38:56

这个有解决吗,我是配置了组播,第一次发送消息到设备,设备应答报错:250,再发消息给设备就可以正常应答了;
过一段时间再发又出现报错:250,再发消息给设备也是可以正常应答;
而且每次报错,就进TCP超时,也没用TCP
    if(initstat & SINT_STAT_TIM_OUT)                                            /* TCP超时中断 */
    {                                                                           /* 产生此中断,CH579库内部会将此socket清除,置为关闭*/
        PRINT("TCP Timoutn");                                                  /* 应用曾需可以重新创建连接 */
    }
感觉很奇怪,像是第一次要先唤醒设备一样?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分