OpenEdv-开源电子网

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

阿波罗STM32F429 UCOSII NETCONNECT TCP客户端 网口通信问题,求大神解惑!!!

[复制链接]

9

主题

209

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1358
金钱
1358
注册时间
2015-12-19
在线时间
108 小时
发表于 2016-12-5 20:01:04 | 显示全部楼层 |阅读模式
20金钱
参考原子哥NETCONN_TCP客户端实验

原子哥例程

原子哥例程

稍作修改在UCOS任务列表中只有一个TCP客户端任务
该任务不做任务切换 ,无限循环执行该任务

while(1)
{
netconn_write(conn,tcp_sbuffer,520,NETCONN_COPY);//发送数据
}

循环发送conn为新创建的netconn连接,tcp_sbuffer为520字节数组首地址,长度520字节。

测试结果

测试结果
此处图中Kbps 有误,实际为KBps这点我已经确认过了。得到网速约(7MB/S)。

while(1)
{
netconn_recv(conn,&recvbuf);//仅接收数据,数据不作任何处理
netconn_write(conn,tcp_sbuffer,520,NETCONN_COPY); //发送数据

}

测试结果2

测试结果2
此处图中Kbps 有误,实际为KBps这点我已经确认过了。得到网速约(55KB/S)。

问题一:此函数netconn_recv(conn,&recvbuf)为网口接收函数,加了此函数严重影响通信速度,小弟想通过读取寄存器标志或其他状态标志判断网口是否接收到数据,使网速依旧能保持(7MB/S)如:

while(1)
{
if(ETH_Handler.RxFrameInfos.length>60)//接收到数据
{
//解析接收到的数据
}
netconn_write(conn,tcp_sbuffer,520,NETCONN_COPY); //发送数据
}

这样做确实可以让发送速度保持在(7MB/S)但是这个判断存在问题, TCP自身协议通信如握手包,NAK包等通信时ETH_Handler.RxFrameInfos.length该值也会改变。
这个值是从网口中断服务函数void ETH_IRQHandler(void)中得到的。
有没有大神知道网口通信可以通过读取哪个寄存器或者判断哪个标志可以判断接收到网口数据了?或者采用其他的方式,只需网速能保持在(3MB/S)以上即可。

问题二:

while(1)
{
netconn_write(conn,tcp_sbuffer,520,NETCONN_COPY);//发送数据
}


仅发送函数无限循环,无接收函数,TCP服务器发送数据20次后程序停止,硬件仿真程序一直在网口中断服务函数,大神知道原因吗?


一下为修改过的程序源码: STM32F429程序.rar (12.22 MB, 下载次数: 540)

最佳答案

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

1、不要让发送数据的任务独占CPU!任务要释放CPU的!因为LWIP的内核任务要做处理!你发送任务独占CPU而不做释放的话网络肯定会死得很透彻的!!!! 2、netconn_recv()是会阻塞任务的,LWIP默认是当没有接收到数据的时候就一直阻塞任务!例程中改成了有10ms的超时时间!也就是说没有接收到数据的时候你的接收任务中相当于有一个10ms的延时,你每次发送520个字节的数据,1s不就是520*100=52000=52KB了!!! 3、发送任务和接收 ...
求指导!!!兄弟
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-12-5 20:01:05 | 显示全部楼层
本帖最后由 zuozhongkai 于 2016-12-8 22:53 编辑

1、不要让发送数据的任务独占CPU!任务要释放CPU的!因为LWIP的内核任务要做处理!你发送任务独占CPU而不做释放的话网络肯定会死得很透彻的!!!!
2、netconn_recv()是会阻塞任务的,LWIP默认是当没有接收到数据的时候就一直阻塞任务!例程中改成了有10ms的超时时间!也就是说没有接收到数据的时候你的接收任务中相当于有一个10ms的延时,你每次发送520个字节的数据,1s不就是520*100=52000=52KB了!!!
3、发送任务和接收任务分开写!不能有哪个任务独占CPU!,这样做的话发送基本可以到3MB/S,LWIP中的网络摄像头就是这个速度!至于更高的网速,自己去优化代码。
4、好好学学多任务系统,买本LWIP的书多看看LWIP的原理,不要想当然的去改代码。
回复

使用道具 举报

9

主题

209

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1358
金钱
1358
注册时间
2015-12-19
在线时间
108 小时
 楼主| 发表于 2016-12-5 20:03:58 | 显示全部楼层
希望大家路过可以给点宝贵的意见       我遇到这问题好久了,实在搞不定,求指点!!!
回复

使用道具 举报

9

主题

209

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1358
金钱
1358
注册时间
2015-12-19
在线时间
108 小时
 楼主| 发表于 2016-12-11 13:17:01 | 显示全部楼层
本帖最后由 yangkefeng 于 2016-12-11 13:53 编辑

非常感谢你的回答
我在探索者开发板上重新试了一下网络摄像头例程
1、不要让发送数据的任务独占CPU!任务要释放CPU的!因为LWIP的内核任务要做处理!你发送任务独占CPU而不做释放的话网络肯定会死得很透彻的!!!!
2、netconn_recv()是会阻塞任务的,LWIP默认是当没有接收到数据的时候就一直阻塞任务!例程中改成了有10ms的超时时间!也就是说没有接收到数据的时候你的接收任务中相当于有一个10ms的延时,你每次发送520个字节的数据,1s不就是520*100=52000=52KB了!!!
3、发送任务和接收任务分开写!不能有哪个任务独占CPU!,这样做的话发送基本可以到3MB/S,LWIP中的网络摄像头就是这个速度!至于更高的网速,自己去优化代码。
    暂时不追求速度,发送任务和接收任务已经分开,我根据网络摄像头例程改程序,开始只有发送任务,MCU作为服务器,我将它改为客户端,在发送任务上实现了断开重连功能,将struct netconn *conn;作为全局变量使用,再创建一个接收任务,在接收任务中先根据conn判断是否处于连接成功状态,再调用netconn_recv()就出现了以下问题,想了好久没解决!!!!你能不能再帮我看下,小弟非常感谢。串口已经打印出接收到的网口数据了,但是每次发送都会断开再重新连接,发送几次之后就连接不上了,跟消息队列有关吗
4、好好学学多任务系统,买本LWIP的书多看看LWIP的原理,不要想当然的去改代码。
    待这个网口发送和接收调通了之后定好好研究研究。

//开始任务:
void run_task(void *pdata)
{
        OS_CPU_SR cpu_sr;         
        OSStatInit();                          
        OS_ENTER_CRITICAL();         
        OSTaskCreate(led_task,(void*)0,(OS_STK*)&LED_TASK_STK[LED_STK_SIZE-1],LED_TASK_PRIO); //LED0任务,亮灭各500MS
        OSTaskCreate(key_task,(void*)0,(OS_STK*)&KEY_TASK_STK[KEY_STK_SIZE-1],KEY_TASK_PRIO); //KEY任务,改变摄像头输出分辨率
        OSTaskCreate(lcd_task,(void*)0,(OS_STK*)&LCD_TASK_STK[LCD_STK_SIZE-1],LCD_TASK_PRIO); //LCD  显示信息
        OSTaskCreate(tcp_task,(void*)0,(OS_STK*)&TCP_TASK_STK[TCP_STK_SIZE-1],TCP_TASK_PRIO); //作为TCP客户端  向PC发送摄像头采集数据
        OSTaskCreate(rcv_task,(void*)0,(OS_STK*)&RCV_TASK_STK[RCV_STK_SIZE-1],RCV_TASK_PRIO); //作为TCP客户端  接收PC数据
        OSTaskSuspend(OS_PRIO_SELF); //1òÆestart_taskèÎÎñ
        OS_EXIT_CRITICAL();     
}



问题

问题

Assertion "recv_tcp: recv for wrong pcb!" failed at line 88 in ..\LWIP\lwip-1.4.1\src\api\api_msg.c
Assertion "PCB must be deallocated outside this function" failed at line 487 in ..\LWIP\lwip-1.4.1\src\api\api_msg.c
Assertion "recvmbox must be deallocated before calling this function" failed at line 489 in ..\LWIP\lwip-1.4.1\src\api\api_msg.c
Assertion "OSQCreate" failed at line 34 in ..\LWIP\arch\sys_arch.c
Assertion "netconn_connect: invalid conn" failed at line 197 in ..\LWIP\lwip-1.4.1\src\api
一开始任务运行都没问题,单片机作为客户端视频传输正常,按键可改变分辨率,LCD,LED任务也正常
之后在,rcv_task中调用 netconn_recv() 出现以上问题,网上没找到该问题的解决方法,
F407实验.rar (1.32 MB, 下载次数: 214)
求指导!!!兄弟
回复

使用道具 举报

9

主题

209

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1358
金钱
1358
注册时间
2015-12-19
在线时间
108 小时
 楼主| 发表于 2016-12-11 13:58:05 | 显示全部楼层
本帖最后由 yangkefeng 于 2016-12-11 17:24 编辑
zuozhongkai 发表于 2016-12-8 22:44
1、不要让发送数据的任务独占CPU!任务要释放CPU的!因为LWIP的内核任务要做处理!你发送任务独占CPU而不做 ...
以上是我根据你的回复重新做的实验,希望能再指导一下
2、netconn_recv()是会阻塞任务的,LWIP默认是当没有接收到数据的时候就一直阻塞任务!
我发现这个函数本身可以产生任务调度啊!!会阻塞任务指的是这个意思吗



求指导!!!兄弟
回复

使用道具 举报

9

主题

209

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1358
金钱
1358
注册时间
2015-12-19
在线时间
108 小时
 楼主| 发表于 2016-12-11 19:46:20 | 显示全部楼层
zuozhongkai 发表于 2016-12-5 20:01
1、不要让发送数据的任务独占CPU!任务要释放CPU的!因为LWIP的内核任务要做处理!你发送任务独占CPU而不做 ...

根据你的回答,采用NETCONNECT TCP客户端试验,功能上已经实现了,只是网速有待提高,上面提到的问题还是存在,不知道是不是跟recv_timeout有关?  灰常感谢!!
求指导!!!兄弟
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-12-12 10:11:44 | 显示全部楼层
yangkefeng 发表于 2016-12-11 13:58
以上是我根据你的回复重新做的实验,希望能再指导一下
2、netconn_recv()是会阻塞任务的,LWIP默认是当 ...

阻塞肯定会引起任务调度的!netconn_recv()会请求消息队列,如果消息队列为空的话就会一直等待,知道消息队列有效。
开往春天的手扶拖拉机
回复

使用道具 举报

9

主题

209

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1358
金钱
1358
注册时间
2015-12-19
在线时间
108 小时
 楼主| 发表于 2016-12-13 10:24:04 | 显示全部楼层
zuozhongkai 发表于 2016-12-12 10:11
阻塞肯定会引起任务调度的!netconn_recv()会请求消息队列,如果消息队列为空的话就会一直等待,知道消 ...

谢啦
求指导!!!兄弟
回复

使用道具 举报

9

主题

209

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1358
金钱
1358
注册时间
2015-12-19
在线时间
108 小时
 楼主| 发表于 2016-12-15 09:24:09 | 显示全部楼层
zuozhongkai 发表于 2016-12-5 20:01
1、不要让发送数据的任务独占CPU!任务要释放CPU的!因为LWIP的内核任务要做处理!你发送任务独占CPU而不做 ...

大神  你好
3、发送任务和接收任务分开写!不能有哪个任务独占CPU!,这样做的话发送基本可以到3MB/S,LWIP中的网络摄像头就是这个速度!至于更高的网速,自己去优化代码

这边你说的网络摄像头就是这个速度,网络摄像头没有加接收函数啊,加上之后就达不到了,新建任务分开发送与接收也不行啊!!!
求指导!!!兄弟
回复

使用道具 举报

9

主题

209

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1358
金钱
1358
注册时间
2015-12-19
在线时间
108 小时
 楼主| 发表于 2016-12-15 21:06:14 | 显示全部楼层
zuozhongkai 发表于 2016-12-5 20:01
1、不要让发送数据的任务独占CPU!任务要释放CPU的!因为LWIP的内核任务要做处理!你发送任务独占CPU而不做 ...

TCPIP内核任务里边调用了 sys_timeouts_mbox_fetch 是不是必须要5ms才能执行其他任务啊,
sys_timeouts_mbox_fetch 是不是必须存在的,也就是调用一次netconn_recv()至少花去了5ms的时间,那发送的速度怎么还能上的去呢
求指导!!!兄弟
回复

使用道具 举报

20

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
456
金钱
456
注册时间
2012-3-19
在线时间
102 小时
发表于 2020-5-12 10:16:36 | 显示全部楼层
yangkefeng 发表于 2016-12-15 21:06
TCPIP内核任务里边调用了 sys_timeouts_mbox_fetch 是不是必须要5ms才能执行其他任务啊,
sys_timeouts_ ...

你好,你的问题解决了么,我碰到了同样的问题,netconn_recv()一用就不行了。其实我只是需要接收几个命令字。反馈一个视频识别的结果。就是收不了数据
回复

使用道具 举报

20

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
456
金钱
456
注册时间
2012-3-19
在线时间
102 小时
发表于 2020-5-12 10:58:47 | 显示全部楼层
本帖最后由 hzxjm 于 2020-5-12 10:59 编辑
zuozhongkai 发表于 2016-12-5 20:01
1、不要让发送数据的任务独占CPU!任务要释放CPU的!因为LWIP的内核任务要做处理!你发送任务独占CPU而不做 ...

恳请正点原子在网络摄像机中加上接收数据部分,分成两个线程的。你们的教程和视频都说需要收发分开。但是现有的例程要不是不分开的,要不就是没有接收功能的。而我们自己在修改程序的过程中都碰到了本贴的情况。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-1 23:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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