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

2019-07-20 18:09发布

参考原子哥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, 下载次数: 513) 2016-12-5 20:00 上传 点击文件名下载附件
程序源码

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
taizonglai
1楼-- · 2019-07-20 20:08
本帖最后由 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的原理,不要想当然的去改代码。
yangkefeng
2楼-- · 2019-07-20 20:48
 精彩回答 2  元偷偷看……
yangkefeng
3楼-- · 2019-07-20 21:11
 精彩回答 2  元偷偷看……
yangkefeng
4楼-- · 2019-07-20 21:13
本帖最后由 yangkefeng 于 2016-12-11 17:24 编辑
zuozhongkai 发表于 2016-12-8 22:44
1、不要让发送数据的任务独占CPU!任务要释放CPU的!因为LWIP的内核任务要做处理!你发送任务独占CPU而不做 ...
以上是我根据你的回复重新做的实验,希望能再指导一下
2、netconn_recv()是会阻塞任务的,LWIP默认是当没有接收到数据的时候就一直阻塞任务!
我发现这个函数本身可以产生任务调度啊!!会阻塞任务指的是这个意思吗



yangkefeng
5楼-- · 2019-07-20 21:20
zuozhongkai 发表于 2016-12-5 20:01
1、不要让发送数据的任务独占CPU!任务要释放CPU的!因为LWIP的内核任务要做处理!你发送任务独占CPU而不做 ...

根据你的回答,采用NETCONNECT TCP客户端试验,功能上已经实现了,只是网速有待提高,上面提到的问题还是存在,不知道是不是跟recv_timeout有关?  灰常感谢!!
taizonglai
6楼-- · 2019-07-21 02:49
yangkefeng 发表于 2016-12-11 13:58
以上是我根据你的回复重新做的实验,希望能再指导一下
2、netconn_recv()是会阻塞任务的,LWIP默认是当 ...

阻塞肯定会引起任务调度的!netconn_recv()会请求消息队列,如果消息队列为空的话就会一直等待,知道消息队列有效。