c - Nucleo STM32F7 上的 UDP 回显

标签 c embedded stm32

我尝试在 NUCLEO-F746ZG 上创建一个 UDP 回显服务器,但是当我启动客户端时,我的主板只给出一个答案。

这是我的线程代码:

static void udpecho_thread(void *arg)
{
    err_t err, recv_err;

    LWIP_UNUSED_ARG(arg);

    conn = netconn_new(NETCONN_UDP);
    if (conn != NULL)
    {
        err = netconn_bind(conn, '0xc0a8b26f', 8);
        if (err == ERR_OK)
        {
            while (1)
            {
                recv_err = netconn_recv(conn, &buf);

                if (recv_err == ERR_OK)
                {
                    addr = netbuf_fromaddr(buf);
                    port = netbuf_fromport(buf);
                    netconn_connect(conn, addr, port);
                    buf->addr.addr = 0;
                    netconn_send(conn, buf);
                    netbuf_delete(buf);
                }
            }
        }
        else
        {
            netconn_delete(conn);
        }
    }
}

在计算机上工作的客户端:

Hostname 192.168.178.111 resolved as 192.168.178.111

Reply from 192.168.178.111:8, time 46 ms OK
Une connexion existante a dû être fermée par l'hôte distant
Une connexion existante a dû être fermée par l'hôte distant
Une connexion existante a dû être fermée par l'hôte distant
Une connexion existante a dû être fermée par l'hôte distant

Statistics: Received=1, Corupted=0, Lost=0

最佳答案

这是预期的。

err = netconn_bind(conn, '0xc0a8b26f', 8); 

仅在线程开始时调用,然后内部是一直有效的 while 循环。例如,只允许执行 1 次。

您可以考虑将此函数重写为类似的内容:

static void udpecho_thread(void *arg) {
    err_t err, recv_err;

    LWIP_UNUSED_ARG(arg);
    while (1) { /* Add this loop */
        conn = netconn_new(NETCONN_UDP);
        if (conn != NULL) {
            err = netconn_bind(conn, '0xc0a8b26f', 8);
            if (err == ERR_OK) {
                while (1) {
                    recv_err = netconn_recv(conn, &buf);

                    if (recv_err == ERR_OK) {
                        addr = netbuf_fromaddr(buf);
                        port = netbuf_fromport(buf);
                        netconn_connect(conn, addr, port);
                        buf->addr.addr = 0;
                        netconn_send(conn,buf);
                        netbuf_delete(buf);
                    } else {
                        break; /* Add break to stop inner loop */
                    }
                }
            }
            netconn_delete(conn);
        }
    }
}

你看,格式化代码非常容易

关于c - Nucleo STM32F7 上的 UDP 回显,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44300923/

相关文章:

c++ - 编译时断言数据类型大小

c++ - 文件处理,复制内容时插入 ÿ 字符

c - 读取引脚上的输入(Teensy)

c - 禁用中断会保护非 volatile 变量还是会发生重新排序?

在stm32微 Controller 上创建虚拟UART

c - 如何开始使用 GCC/GNU

c - 如何使用 srand() 创建随机点?

c - 在 Cygwin 或 MinGW 中将 CMake 与 AVR 工具链结合使用

debugging - 高速追踪

c - i2c传输,stm32f103作为Master,STOP条件生成问题