OpenEdv-开源电子网

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

阿波罗F429,我想在网络摄像头头例程中,加一个接收函数

[复制链接]

61

主题

338

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1342
金钱
1342
注册时间
2021-4-28
在线时间
504 小时
发表于 2022-7-31 20:40:10 | 显示全部楼层 |阅读模式
1金钱
阿波罗F429,我想在网络摄像头头例程中,加一个接收函数,可总是报错,如果是就是小数据的收发可以实现,摄像头发送数据大了,就会这样Assertion "do_writemore: invalid length!" failed at line 1269 in ..\LWIP\lwip-1.4.1\src\api\api_msg.cAssertion "tcpip_thread: invalid message" failed at line 146 in ..\LWIP\lwip-1.4.1\src\api\tcpip.c


最佳答案

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

使用道具 举报

61

主题

338

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1342
金钱
1342
注册时间
2021-4-28
在线时间
504 小时
 楼主| 发表于 2022-7-31 20:40:11 | 显示全部楼层
本帖最后由 CJC529 于 2022-8-11 12:35 编辑

实现了实现了

源码(实现发和收).zip

2.14 MB, 下载次数: 5

源码(实现发和收).zip

2.14 MB, 下载次数: 7

实现了实现了

源码(实现发和收).zip

2.14 MB, 下载次数: 3

回复

使用道具 举报

61

主题

338

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1342
金钱
1342
注册时间
2021-4-28
在线时间
504 小时
 楼主| 发表于 2022-7-31 20:41:23 | 显示全部楼层
file:///C:/Users/CJC/Desktop/%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20220731204028.png
微信截图_20220731204028.png
回复

使用道具 举报

61

主题

338

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1342
金钱
1342
注册时间
2021-4-28
在线时间
504 小时
 楼主| 发表于 2022-7-31 20:42:33 | 显示全部楼层
//网络摄像头任务
void netcamera_task(void *arg)
{
    err_t err;
    struct netconn *conn;
    static ip_addr_t ipaddr;
    u8 remot_addr[4];
    static u16_t port;
   
    u8 res=0;
    u32 *tbuf;
   
    LWIP_UNUSED_ARG(arg);

    conn = netconn_new(NETCONN_TCP);  //创建一个TCP链接
    netconn_bind(conn,IP_ADDR_ANY,8088);  //绑定端口 8088号端口
    netconn_listen(conn);                  //进入监听模式
   
    while(1)    //等待连接
    {
        err=netconn_accept(conn,&newconn);  //接收连接请求
        if(err==ERR_OK) //成功检测到连接
        {
            if (client_init(newconn) != ERR_OK)
            {
                netconn_close(newconn);
                netconn_delete(newconn);
            }
            newconn->recv_timeout = 10;                  /* 防止阻塞 */
            netconn_getaddr(newconn,&ipaddr,&port,0); //获取远端IP地址和端口号
            remot_addr[3]=(uint8_t)(ipaddr.addr>>24);
            remot_addr[2]=(uint8_t)(ipaddr.addr>>16);
            remot_addr[1]=(uint8_t)(ipaddr.addr>>8);
            remot_addr[0]=(uint8_t)(ipaddr.addr);
            printf("主机%d.%d.%d.%d连接上网络摄像头服务器,主机端口号为:%d\r\n",\
                    remot_addr[0],remot_addr[1],remot_addr[2],remot_addr[3],port);
            g_tcp_server_flag |= 1 << 0;
            camera_init();
            delay_ms(1000); //此延时一定要加!!
            while(1)        //开始视频传输
            {
                res=netcam_fifo_read(&tbuf);    //读取FIFO中的数据
                if(res)     //有数据要发送
                {
                    err=netconn_write(newconn,tbuf,NETCAM_LINE_SIZE*4,NETCONN_COPY);//发送数据
                    if((err==ERR_CLSD)||(err==ERR_RST))//关闭连接,或者重启网络
                    {
                        camera_deinit();//复位网络摄像头
                        netconn_close(newconn);
                        netconn_delete(newconn);
                        g_tcp_server_flag = 0;
                        printf("主机:%d.%d.%d.%d断开与视频服务器的连接\r\n",\
                            remot_addr[0], remot_addr[1],remot_addr[2],remot_addr[3]);
                        break;
                    }
                }else
                {
                    OSTimeDlyHMSM(0,0,0,10);//延时2ms
                }
            }
        }
    }
}





void tcp_recv_thread(void *arg)
{
    err_t recv_err;
    struct pbuf *q;
    uint32_t  data_len = 0;
    OS_CPU_SR cpu_sr = 0;                                               /* 定义一开关中断变量 */
    LWIP_UNUSED_ARG(arg);                                           /* 防止报错 */
    while(1)
    {
        if ((g_tcp_server_flag & TCP_SERVER_EN_FLAG) == TCP_SERVER_EN_FLAG)
        {
            struct netbuf   *recvbuf;
//            newconn->recv_timeout = 10;
            /* 接收端 */
            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,500);
    }
}
回复

使用道具 举报

61

主题

338

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1342
金钱
1342
注册时间
2021-4-28
在线时间
504 小时
 楼主| 发表于 2022-7-31 20:50:21 | 显示全部楼层
Assertion "conn->write_offset < conn->current_msg->msg.w.len" failed at line 1223 in ..\LWIP\lwip-1.4.1\src\api\api_msg.c
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 07:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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