工具/软件:TI-RTOS
您好!
我刚刚开始在 TM4C 上与 TI-RTOS 合作、首先让我说一下 TI 开发团队在这方面所做的出色工作。 我已经使用 eCos 和 FreeRTOS 完成了很多开发工作、向 TI-RTOS 过渡是一个非常愉快的体验。 我向它移植了一个相当复杂的应用程序、但遇到的困难非常少。 干得不错。
但是、我有一个问题、我似乎无法解决。 此应用程序的要求之一是偶尔需要向全局广播地址(255.255.255.255)发送 UDP 数据包,而无论我做什么,我都不能做到这一点。 FreeRTOS 使用相当相似的 UDP 堆栈、此代码在该操作系统下工作正常(可以肯定的是、在具有完全不同网络驱动程序的完全不同的处理器上)。
有没有人有幸向全球广播传输数据? 如果感兴趣、我可以接收发送到广播地址的数据包、但它们在发送到广播地址时似乎消失了。 我已经在以太网级别进行了无线通信、完全没有任何数据被传输。
本质上是代码。 我对我的操作代码做了一些小改动、删除了一些#define 常量、但简而言之、这就是。
我已经尝试运行调试器、我实际上看不到会丢弃数据包的任何情况。
有没有人有幸向全球广播传输数据?
感谢您的任何指导!
本
空 udpBroadcastHandler (UARg arg0、UARg arg1) { 内部 字节接收; 内部 字节 Sent; 内部 状态; 内部 服务器; FD_SET readSet; struct sockaddr_in localAddr; struct sockaddr_in clientAddr; struct sockaddr_in BroadcastAddr; socklen_t 地址; 特性 缓冲区[512]; 特性 UDP_WRITE_BUF[512]; unsigned int UDP_WRITE_BUF_SIZE; 服务器=套接字(AF_iNet、SOCK_DGRAM、IPPROTO_UDP); if (server ==1){ System_printf ("错误:未创建套接字。\n"); 转到关断; } memset (localAddr、0、sizeof (localAddr)); localAddr.Sin_Family = AF_iNet; //还尝试将 localaddr.sin_addr.s_addr 绑定到我的 IP 地址 localAddr.sin_addr.s_addr = htonl (INADDR_ANY); localAddr.sin 端口= htons (65001); memset (&BroadcastAddr、0、sizeof (BroadcastAddr)); BroadcastAddr.Sin_Family = AF_iNet; BroadcastAddr.Sin_addr.s_addr = htonl (0xFFFFFFFF);//htonl 不是必需的、因为反向字节顺序为=、但不会影响任何内容 BroadcastAddr.Sin_port = htons (65002); status = bind (server、(struct sockaddr *)&localAddr、sizeof (localAddr)); 如果(status =-1){ System_printf ("错误:绑定失败。\n"); 转到关断; } 执行{ fd_zero (readSet); fD_set (服务器、readSet); addrlen = sizeof (clientAddr); Status = select (server + 1、readSet、NULL、NULL、NULL); 如果(状态> 0){ if (fd_isset (server、readSet)){ bytesRcvd = recvfrom (服务器、缓冲区、UDPPACKETSIZE、0、 (struct sockaddr *)&clientAddr、&addrlen); 如果(bytesRcvd >0){ System_printf ("GotBytes!"); //无论数据包是直接发送到我的 IP 地址还是广播地址,都可以正常接收 if (buffer[0]= 0xAA){/*上游器件广播* udp_WRITE_BUf_SIZE = System_sprintf (udp_WRITE_BUf、"活动"); //Send Back to the IP Address that broadcasted to us on 65002 //这按预期工作 clientAddr.sin 端口=htons (65002); 字节 Sent = sendto (server、udp_WRITE_Buf、udp_WRITE_BUf_SIZE、0、(struct sockaddr *)&clientAddr、 sizeof (clientAddr)); if (bytesSent!= udp_WRITE_BUf_SIZE){ System_printf ("发送到广播客户端时出错\n"); } //如果我们位于不同的子网,也将其发送回全局广播地址 //这不发送任何内容,但字节 Sent 确实等于 udp_WRITE_BUf_SIZE,因此不会触发错误 //操作系统似乎认为数据包是发送的,尽管它绝对不是 字节 Sent = sendto (server、udp_WRITE_Buf、udp_WRITE_BUf_SIZE、0、(struct sockadr *)&BroadcastAddr、 sizeof (BroadcastAddr); if (bytesSent!= udp_WRITE_BUf_SIZE){ System_printf ("发送到广播地址时出错"); } UDP_WRITE_BUF_SIZE = 0; } } } while (status > 0); shutdown: 如果(服务器> 0){ 关闭(服务器); } }//结束任务