首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用LWIP和FreeRTOS使多播在stm32f7上工作

如何使用LWIP和FreeRTOS使多播在stm32f7上工作
EN

Stack Overflow用户
提问于 2019-11-06 01:53:40
回答 1查看 603关注 0票数 0

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

我已经实现了LWIP和FreeRTOS中间件,它似乎工作得很好。我还设置了一个向239.192.0.4端口60003发送多播消息的windows程序,并在我的网络上的其他设备上测试了消息的接收情况。但是当我使用STM32f7处理器时,似乎一切正常,但它没有接收到任何东西。

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

代码语言:javascript
运行
复制
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()接收到的数据,但是recvfrom()仍然被阻塞,就像它从未接收到任何东西一样。此外,当我可以看到我的其他设备接收到来自多播组的消息时也是如此。

代码语言:javascript
运行
复制
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中:

代码语言:javascript
运行
复制
#define LWIP_IGMP 1

#define LWIP_IPV4 1

#define LWIP_SOCKET 1

#define LWIP_UDP 1

#define SO_REUSE 1 

在ethernetif.c中:

代码语言:javascript
运行
复制
netif->flags |= NETIF_FLAG_IGMP; //in low_level_init function

在stm32f7xx_hal_eth.c中:

代码语言:javascript
运行
复制
macinit.PromiscuousMode = ETH_PROMISCUOUS_MODE_ENABLE;
macinit.MulticastFramesFilter = ETH_MULTICASTFRAMESFILTER_NONE;

我没有收到任何错误,所以我很迷茫,希望在这一点上有任何建议。

EN

Stack Overflow用户

发布于 2019-11-22 01:37:48

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

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58716918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档