完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
采用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个回答
|
|
麻烦请提供一下不同组网下主要节点的IP信息和CH57xNET_SocketUdpSendTo()的目标IP信息。从您的说法中,整个网络的带宽还足够,芯片的还有足够的处理能力,与CH57xNET_SocketUdpSendTo()特定函数调用相关。
|
|
|
|
100网段PC一台,本设备一台,其它分20网段,10网段,30网段。
|
|
|
|
CH57xNET_SocketUdpSendTo() 目标IP=192.168.100.112 ,PROT=6500
|
|
|
|
这个有解决吗,我是配置了组播,第一次发送消息到设备,设备应答报错:250,再发消息给设备就可以正常应答了; 过一段时间再发又出现报错:250,再发消息给设备也是可以正常应答; 而且每次报错,就进TCP超时,也没用TCP if(initstat & SINT_STAT_TIM_OUT) /* TCP超时中断 */ { /* 产生此中断,CH579库内部会将此socket清除,置为关闭*/ PRINT("TCP Timoutn"); /* 应用曾需可以重新创建连接 */ } 感觉很奇怪,像是第一次要先唤醒设备一样? |
|
|
|
只有小组成员才能发言,加入小组>>
514 浏览 1 评论
CH579M+RT-Thread,RTC从Sleep模式唤醒失败是什么原因?
2901 浏览 2 评论
2396 浏览 1 评论
860浏览 2评论
CH32F103C8T6使用当前官网上的CDC例程会出现设备描述符请求失败
400浏览 1评论
678浏览 1评论
riscv-none-embed-objcopy: \'PWM_Output.elf\': No such file这个咋解决,
412浏览 1评论
511浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 23:53 , Processed in 1.005843 second(s), Total 85, Slave 68 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号