OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 624|回复: 1

设置UDP的发送及接收 为非阻塞模式

[复制链接]

3

主题

104

帖子

0

精华

高级会员

Rank: 4

积分
961
金钱
961
注册时间
2012-5-8
在线时间
343 小时
发表于 2024-6-20 15:44:14 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 mmlyy2012 于 2024-6-20 15:56 编辑

在LWIP教程的第二十章 SOCKET UDP 实验中,有这么一句话:
主函数的循环中不断通过 recv 接收数据并使用消息队列发送,其中 recv 可设为非阻塞模式
请问一下 程序如何更改才能设置UDP的发送及接收 为非阻塞模式芯片为STM32H743  OS为freeRTOS
使用的程序为例程 lwIP例程10 lwIP_SOCKET_UDP实验
void lwip_data_send(void)
{
    sys_thread_new("lwip_send_thread", lwip_send_thread, NULL, 512, LWIP_SEND_THREAD_PRIO );
}

/**
* @brief       lwip_demo实验入口
* @param       无
* @retval      无
*/
void lwip_demo(void)
{
    BaseType_t lwip_err;
    char *tbuf;  int nonblock = 1;
    lwip_data_send();                                   /* 创建发送数据线程 */
    memset(&local_info, 0, sizeof(struct sockaddr_in)); /* 将服务器地址清空 */
    local_info.sin_len = sizeof(local_info);            /* 计算Socket地址信息结构体长度 */
    local_info.sin_family = AF_INET;                    /* IPv4地址 */
    local_info.sin_port = htons(LWIP_DEMO_PORT);        /* 设置端口号 */
    local_info.sin_addr.s_addr = htons(INADDR_ANY);     /* 设置本地IP地址 */

    sock_fd = socket(AF_INET, SOCK_DGRAM, 0);           /* 建立一个新的socket连接 协议族 指定socket类型 指定使用的协议 */
    tbuf = mymalloc(SRAMIN, 200); /* 申请内存 */
    sprintf((char *)tbuf, "Port:%d", LWIP_DEMO_PORT);    /* 客户端端口号 */
    lcd_show_string(5, 150, 200, 16, 16, tbuf, BLUE);

    /* 建立绑定 */
    bind(sock_fd, (struct sockaddr *)&local_info, sizeof(struct sockaddr_in));

    while (1)
    {
        memset(g_lwip_demo_recvbuf, 0, sizeof(g_lwip_demo_recvbuf));
        recv(sock_fd, (void *)g_lwip_demo_recvbuf, sizeof(g_lwip_demo_recvbuf), 0);

        lwip_err = xQueueSend(g_display_queue,&g_lwip_demo_recvbuf,0);

        if (lwip_err == errQUEUE_FULL)
        {
            printf("队列Key_Queue已满,数据发送失败!\r\n");
        }
    }
}

/**
* @brief       发送数据线程函数
* @param       pvParameters : 传入参数(未用到)
* @retval      无
*/
void lwip_send_thread(void *pvParameters)
{
    pvParameters = pvParameters;
     BaseType_t lwip_err;   
    local_info.sin_addr.s_addr = inet_addr(IP_ADDR);                /* 需要发送的远程IP地址 */

    while (1)
    {
        if((g_lwip_send_flag & LWIP_SEND_DATA) == LWIP_SEND_DATA)     /* 有数据要发送 */
        {
            sendto(sock_fd,                                         /* scoket */
                  (char *)g_lwip_demo_sendbuf,                        /* 发送的数据 */
                  sizeof(g_lwip_demo_sendbuf), 0,                     /* 发送的数据大小 */
                  (struct sockaddr *)&local_info,                   /* 接收端地址信息 */
                  sizeof(local_info));                              /* 接收端地址信息大小 */

            g_lwip_send_flag &= ~LWIP_SEND_DATA;
        }

        vTaskDelay(100);



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165312
金钱
165312
注册时间
2010-12-1
在线时间
2108 小时
发表于 2024-6-22 19:23:00 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 22:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表