gpt4 book ai didi

c - 如何使用 LWIP 和 FreeRTOS 让多播在 stm32f7 上工作

转载 作者:行者123 更新时间:2023-11-30 16:11:05 24 4
gpt4 key购买 nike

您好,我正在尝试使用 LWIP 和 FreeRTOS 在 STM32f7(NucleoF767zi 板)上启动并运行 UDP 多播套接字。

我已经实现了 LWIP 和 FreeRTOS 中间件,并且看起来工作正常。我还设置了一个 Windows 程序,它将多播消息发送到 239.192.0.4 端口 60003,并在网络上的其他设备上进行了测试,消息是否可以正常接收。但是当我使用 STM32f7 处理器时,一切似乎都工作正常,但它没有收到任何东西。

我使用从类似指南中找到的代码来加入多播组,并且在调试代码时没有出现错误:

int Bind(int sock, uint16_t port) {
//struct sockaddr_in serv_addr;
memset((char*) &serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(port);
if (bind(sock, (struct sockaddr* ) &serv_addr,
(socklen_t ) sizeof(serv_addr)) < 0)
return -1;
return 0;
}

int JoinGroup(int sock, const char *join_ip) {
ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(join_ip);
ip4_addr_t localAddress = MX_LWIP_Get_IP();//Gets the local IP interface address
mreq.imr_interface.s_addr = localAddress.addr;
;
if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*) &mreq,
sizeof(mreq)) < 0)
return -1;
return 0;
}

int MulticastStart() {
int sock = socket(AF_INET, SOCK_DGRAM, 0);
int reuse = 1;
/* Dont know if SO_REUSEADDER is nenecessary doesn't seem to make a difference*/
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*) &reuse,
sizeof(reuse)) < 0) {
perror("Setting SO_REUSEADDR error");
} else
printf("Setting SO_REUSEADDR...OK.\n");

Bind(sock, 60003);
JoinGroup(sock, "239.192.0.4");
return sock;
// Now you can do recvfrom() in RTOS task.
}

然后我有一个 FreeRTOS 任务,我尝试打印从 recvfrom() 接收到的数据,但 receivevfrom() 仍然被阻止,就像它从未接收到任何东西一样。另外,当我看到我的其他设备正常接收来自多播组的消息时。

void StartLWIPReceiverTask(void const *argument) {
osSemaphoreWait(LWIPsemaphore, osWaitForever); // Wait indefinitely for a free semaphore
int sock = MulticastStart();
char test[256];
memset(&test, 0, sizeof(test));
int addrlen = sizeof(serv_addr);
/* Infinite loop */
for (;;) {
int nbytes = recvfrom(sock, test, 255, 0,
(struct sockaddr* ) &serv_addr, (socklen_t* )&addrlen);
if (nbytes > 0) {
HAL_UART_Transmit(&huart3, (uint8_t*) test, (uint16_t) strlen(test),
1000);
memset(&test, 0, sizeof(test));
}
osDelay(1);
}
}

我设置了以下标志:在 lwipopts.h 中:

#define LWIP_IGMP 1

#define LWIP_IPV4 1

#define LWIP_SOCKET 1

#define LWIP_UDP 1

#define SO_REUSE 1

在 ethernetif.c 中:

netif->flags |= NETIF_FLAG_IGMP; //in low_level_init function

在stm32f7xx_hal_eth.c中:

macinit.PromiscuousMode = ETH_PROMISCUOUS_MODE_ENABLE;
macinit.MulticastFramesFilter = ETH_MULTICASTFRAMESFILTER_NONE;

我没有收到任何错误,所以我很迷茫,希望此时能得到任何提示。

最佳答案

如果其他人遇到这个问题,我通过创建一个新项目并复制代码并在相同文件中设置相同的标志来解决它。不知道为什么它现在有效,但如果它有效它就有效:)

关于c - 如何使用 LWIP 和 FreeRTOS 让多播在 stm32f7 上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58716918/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com