OpenEdv-开源电子网

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

在学习LWIP时,NETCONN编程接口收发两任务的代码该如何实现呢

[复制链接]

61

主题

338

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1342
金钱
1342
注册时间
2021-4-28
在线时间
504 小时
发表于 2022-7-13 09:33:53 | 显示全部楼层 |阅读模式
10金钱

最佳答案

查看完整内容[请看2#楼]

http://www.openedv.com/forum.php?mod=viewthread&tid=338248&extra=
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

61

主题

338

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1342
金钱
1342
注册时间
2021-4-28
在线时间
504 小时
 楼主| 发表于 2022-7-13 09:33:54 | 显示全部楼层
回复

使用道具 举报

13

主题

644

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1976
金钱
1976
注册时间
2021-4-16
在线时间
505 小时
发表于 2022-7-13 10:43:42 | 显示全部楼层
帮顶   
回复

使用道具 举报

61

主题

338

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1342
金钱
1342
注册时间
2021-4-28
在线时间
504 小时
 楼主| 发表于 2022-7-30 17:23:29 | 显示全部楼层
不知道为什么我一设置成两个任务就死机
回复

使用道具 举报

61

主题

338

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1342
金钱
1342
注册时间
2021-4-28
在线时间
504 小时
 楼主| 发表于 2022-7-31 21:18:18 | 显示全部楼层
void tcp_send_thread(void *arg)
{
    err_t err;
    uint8_t remote_addr[4];
    LWIP_UNUSED_ARG(arg);                                           /* 防止报错 */
    while(1)
    {
        if ((g_tcp_server_flag & TCP_SERVER_EN_FLAG) == TCP_SERVER_EN_FLAG)
        {
            if ((g_tcp_server_flag & TCP_SERVER_SEND_FLAG) == TCP_SERVER_SEND_FLAG)
            {
//                printf("发送 %p\n", clientaddr.conn[1]);
                err = netconn_write(clientaddr.conn[1],tcp_server_sendbuf,strlen((char *)tcp_server_sendbuf),NETCONN_COPY);
                if((err==ERR_CLSD)||(err==ERR_RST))
                {
                    netconn_close(clientaddr.conn[1]);
                    netconn_delete(clientaddr.conn[1]);
                    printf("主机:%d.%d.%d.%d断开连接\r\n",\
                            remote_addr[0], remote_addr[1],remote_addr[2],remote_addr[3]);
                }
                g_tcp_server_flag &= ~TCP_SERVER_SEND_FLAG;
            }
        }
      
        OSTimeDlyHMSM(0,0,0,200);
    }
}
回复

使用道具 举报

61

主题

338

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1342
金钱
1342
注册时间
2021-4-28
在线时间
504 小时
 楼主| 发表于 2022-7-31 21:18:41 | 显示全部楼层
void tcp_recv_thread(void *arg)
{
    err_t recv_err;
    struct pbuf *q;
    uint32_t  data_len = 0;
    OS_CPU_SR cpu_sr;                                               /* 定义一开关中断变量 */
    LWIP_UNUSED_ARG(arg);                                           /* 防止报错 */
    while(1)
    {
        if ((g_tcp_server_flag & TCP_SERVER_EN_FLAG) == TCP_SERVER_EN_FLAG)
        {
            struct netbuf   *recvbuf;
            /* 接收端 */
            if ((recv_err = netconn_recv(clientaddr.conn[1],&recvbuf)) == ERR_OK)       /* 接收数据不为空 */
            {
                OS_ENTER_CRITICAL();                                                    /* 进入临界区 */
                memset(tcp_server_recvbuf,0,TCP_SERVER_RX_BUFSIZE);                     /* 接收缓冲区清零 */
                for(q = recvbuf->p;q != NULL;q = q->next)                               /* 遍寻下一个pbuf */
                {
                    if (q ->len > (TCP_SERVER_RX_BUFSIZE - data_len))
                    {
                        memcpy(tcp_server_recvbuf + data_len,q ->payload,(TCP_SERVER_RX_BUFSIZE - data_len));
                    }
                    else
                    {
                        memcpy(tcp_server_recvbuf + data_len,q ->payload,q ->len);
                    }
                    data_len += q->len;
                    if (data_len > TCP_SERVER_RX_BUFSIZE)                               /* 超过TCP接收数组 */
                    {
                        break;                                                          /* 跳出 */
                    }
                }
                OS_EXIT_CRITICAL();                                                     /* 退出临界区 */
                data_len = 0;
                printf("%s\r\n",tcp_server_recvbuf);
                netbuf_delete(recvbuf);
            }
            else if (recv_err == ERR_CLSD)
            {
                netconn_close(clientaddr.conn[1]);
                netconn_delete(clientaddr.conn[1]);
                printf("客户端主机:%d.%d.%d.%d断开连接\r\n",lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3]);
                break;
            }
        }
        OSTimeDlyHMSM(0,0,0,200);
    }
}
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 09:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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