完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
各位大神,最近在调试STM32F4+UCOSIII+LWIP网口功能,但是速度一直上不去,实在没有好的办法了!
之前参考了论坛中http://www.openedv.com/thread-43116-1-1.html 这篇文档,如下图 @zuozhongkai 我把我自己的测试结果发上来! |
|
相关推荐
23个回答
|
|
第二个问题就是:当与上位机进行数据交互时,也就是每当接收到一次上位机的命令后都往上位机返回8192个字节,这里采用数据循环发送的方式,每次发送间隔0ms,发送几次就会死机,提示发送失败。。。。。
|
|
|
|
这是第二个问题用到的代码。。。。
[AppleScript] 纯文本查看 复制代码 #include "tcp_client_demo.h"#include "lwip/opt.h"#include "lwip_comm.h"#include "lwip/lwip_sys.h"#include "lwip/api.h"#include "includes.h"#include "key.h"struct netconn *tcp_clientconn; //TCP CLIENT网络连接结构体u8 tcp_client_recvbuf[TCP_CLIENT_RX_BUFSIZE]; //TCP客户端接收数据缓冲区u8 tcp_client_sendbuf[TCP_CLIENT_TX_BUFSIZE]; //TCP客户端接收数据缓冲区//u8 *tcp_client_sendbuf="Explorer STM32F407 NETCONN TCP Client send datarn"; //TCP客户端发送数据缓冲区u8 tcp_client_flag; //TCP客户端数据发送标志位static u16* recv_data;OS_EVENT *Sem_Event; //定义一个信号量OS_EVENT *Str_Box; //定义一个消息邮箱//TCP客户端任务#define TCPCLIENT_PRIO 6//任务堆栈大小#define TCPCLIENT_STK_SIZE 300//任务堆栈OS_STK TCPCLIENT_TASK_STK[TCPCLIENT_STK_SIZE];////TCP客户端发送任务#define TCPCLIENT_SEND_PRIO 7//任务堆栈的大小 #define TCPCLIENT_SEND_STK_SIZE 300 ////任务堆栈OS_STK TCPCLIENT_SEND_TASK_STK[TCPCLIENT_SEND_STK_SIZE];u8 Recv_Lwip_Flag;//任务函数声明static void tcp_client_send_thread(){ OS_CPU_SR cpu_sr; err_t err;// u8 Recv_Lwip_Flag; while(1) { Recv_Lwip_Flag = *((u8*)OSMboxPend(Str_Box,5,&err));//请求消息邮箱 if((Recv_Lwip_Flag & LWIP_SEND_DATA)==LWIP_SEND_DATA) { err = netconn_write(tcp_clientconn ,tcp_client_sendbuf,8192,NETCONN_COPY); //发送tcp_server_sentbuf中的数据 if(err != ERR_OK) { printf("发送失败rn"); }// Recv_Lwip_Flag &= ~LWIP_SEND_DATA; } else OS_Sched(); }}//tcp客户端任务函数static void tcp_client_thread(void *arg){ OS_CPU_SR cpu_sr; u32 data_len = 0; err_t err,recv_err; static ip_addr_t server_ipaddr,loca_ipaddr; static u16_t server_port,loca_port; LWIP_UNUSED_ARG(arg); server_port = REMOTE_PORT; IP4_ADDR(&server_ipaddr, lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3]); tcp_clientconn = netconn_new(NETCONN_TCP); //创建一个TCP链接 err = netconn_connect(tcp_clientconn,&server_ipaddr,server_port);//连接服务器 if(err != ERR_OK) netconn_delete(tcp_clientconn); //返回值不等于ERR_OK,删除tcp_clientconn连接 else if (err == ERR_OK) //处理新连接的数据 { struct netbuf *recvbuf; netconn_getaddr(tcp_clientconn,&loca_ipaddr,&loca_port,1); //获取本地IP主机IP地址和端口号 printf("连接上服务器%d.%d.%d.%d,本机端口号为:%drn",lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3],loca_port); while(1) { if((recv_err = netconn_recv(tcp_clientconn,&recvbuf)) == ERR_OK) //接收到数据 { OS_ENTER_CRITICAL(); //关中断 recv_data = (u16*)recvbuf->p->payload; //得到上位机发送的数据 data_len = recvbuf->p->len; OS_EXIT_CRITICAL(); //开中断 tcp_client_flag |= LWIP_SEND_DATA; OSMboxPost(Str_Box,&tcp_client_flag); //发送消息tcp_client_flag netbuf_delete(recvbuf); }else if(recv_err == ERR_CLSD) //关闭连接 { netconn_close(tcp_clientconn); netconn_delete(tcp_clientconn); printf("服务器%d.%d.%d.%d断开连接rn",lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3]); break; }else OS_Sched(); } }}//创建TCP客户端线程//返回值:0 TCP客户端创建成功// 其他 TCP客户端创建失败INT8U tcp_client_init(void){ INT8U res; OS_CPU_SR cpu_sr; u16 i; for(i=0;i<9000;i++) { tcp_client_sendbuf = i; } OS_ENTER_CRITICAL(); //关中断 res = OSTaskCreate(tcp_client_thread,(void*)0,(OS_STK*)&TCPCLIENT_TASK_STK[TCPCLIENT_STK_SIZE-1],TCPCLIENT_PRIO); //创建TCP客户端线程 res = OSTaskCreate(tcp_client_send_thread,(void*)0,(OS_STK*)&TCPCLIENT_SEND_TASK_STK[TCPCLIENT_SEND_STK_SIZE-1],TCPCLIENT_SEND_PRIO); //创建TCP客户端线程// Sem_Event = OSSemCreate(0); //创建一个信号量用于任务间的同步 Str_Box = OSMboxCreate((void*)0); //创建消息邮箱 OS_EXIT_CRITICAL(); //开中断 return res;} |
|
|
|
[AppleScript] 纯文本查看 复制代码
#include "tcp_client_demo.h"#include "lwip/opt.h"#include "lwip_comm.h"#include "lwip/lwip_sys.h"#include "lwip/api.h"#include "includes.h"#include "key.h" struct netconn *tcp_clientconn;//TCP CLIENT网络连接结构体u8 tcp_client_recvbuf[TCP_CLIENT_RX_BUFSIZE];//TCP客户端接收数据缓冲区u8 tcp_client_sendbuf[TCP_CLIENT_TX_BUFSIZE];//TCP客户端接收数据缓冲区//u8 *tcp_client_sendbuf="Explorer STM32F407 NETCONN TCP Client send datarn";//TCP客户端发送数据缓冲区u8 tcp_client_flag;//TCP客户端数据发送标志位static u16* recv_data; OS_EVENT *Sem_Event; //定义一个信号量 OS_EVENT *Str_Box; //定义一个消息邮箱//TCP客户端任务#define TCPCLIENT_PRIO6//任务堆栈大小#define TCPCLIENT_STK_SIZE300//任务堆栈OS_STK TCPCLIENT_TASK_STK[TCPCLIENT_STK_SIZE];////TCP客户端发送任务#define TCPCLIENT_SEND_PRIO 7//任务堆栈的大小 #define TCPCLIENT_SEND_STK_SIZE 300 ////任务堆栈OS_STK TCPCLIENT_SEND_TASK_STK[TCPCLIENT_SEND_STK_SIZE];u8 Recv_Lwip_Flag;//任务函数声明static void tcp_client_send_thread(){ OS_CPU_SR cpu_sr; err_t err;// u8 Recv_Lwip_Flag; while(1){ Recv_Lwip_Flag = *((u8*)OSMboxPend(Str_Box,5,&err));//请求消息邮箱 if((Recv_Lwip_Flag & LWIP_SEND_DATA)==LWIP_SEND_DATA){err = netconn_write(tcp_clientconn ,tcp_client_sendbuf,8192,NETCONN_COPY); //发送tcp_server_sentbuf中的数据if(err != ERR_OK){printf("发送失败rn");}//Recv_Lwip_Flag &= ~LWIP_SEND_DATA; }else OS_Sched();}}//tcp客户端任务函数static void tcp_client_thread(void *arg){ OS_CPU_SR cpu_sr; u32 data_len = 0; err_t err,recv_err; static ip_addr_t server_ipaddr,loca_ipaddr; static u16_t server_port,loca_port; LWIP_UNUSED_ARG(arg); server_port = REMOTE_PORT; IP4_ADDR(&server_ipaddr, lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3]);tcp_clientconn = netconn_new(NETCONN_TCP); //创建一个TCP链接err = netconn_connect(tcp_clientconn,&server_ipaddr,server_port);//连接服务器if(err != ERR_OK) netconn_delete(tcp_clientconn); //返回值不等于ERR_OK,删除tcp_clientconn连接else if (err == ERR_OK) //处理新连接的数据{ struct netbuf *recvbuf;netconn_getaddr(tcp_clientconn,&loca_ipaddr,&loca_port,1); //获取本地IP主机IP地址和端口号printf("连接上服务器%d.%d.%d.%d,本机端口号为:%drn",lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3],loca_port);while(1){if((recv_err = netconn_recv(tcp_clientconn,&recvbuf)) == ERR_OK) //接收到数据{OS_ENTER_CRITICAL(); //关中断recv_data = (u16*)recvbuf->p->payload; //得到上位机发送的数据 data_len = recvbuf->p->len; OS_EXIT_CRITICAL(); //开中断 tcp_client_flag |= LWIP_SEND_DATA; OSMboxPost(Str_Box,&tcp_client_flag); //发送消息tcp_client_flagnetbuf_delete(recvbuf);}else if(recv_err == ERR_CLSD) //关闭连接{netconn_close(tcp_clientconn);netconn_delete(tcp_clientconn);printf("服务器%d.%d.%d.%d断开连接rn",lwipdev.remoteip[0],lwipdev.remoteip[1], lwipdev.remoteip[2],lwipdev.remoteip[3]);break;}else OS_Sched();}}}//创建TCP客户端线程//返回值:0 TCP客户端创建成功//其他 TCP客户端创建失败INT8U tcp_client_init(void){INT8U res;OS_CPU_SR cpu_sr;u16 i;for(i=0;i<9000;i++){ tcp_client_sendbuf = i;}OS_ENTER_CRITICAL();//关中断res = OSTaskCreate(tcp_client_thread,(void*)0,(OS_STK*)&TCPCLIENT_TASK_STK[TCPCLIENT_STK_SIZE-1],TCPCLIENT_PRIO); //创建TCP客户端线程res = OSTaskCreate(tcp_client_send_thread,(void*)0,(OS_STK*)&TCPCLIENT_SEND_TASK_STK[TCPCLIENT_SEND_STK_SIZE-1],TCPCLIENT_SEND_PRIO); //创建TCP客户端线程//Sem_Event = OSSemCreate(0); //创建一个信号量用于任务间的同步Str_Box = OSMboxCreate((void*)0); //创建消息邮箱OS_EXIT_CRITICAL();//开中断return res;} |
|
|
|
麻烦您帮我看一下问题出在哪?谢谢。。。
|
|
|
|
只有小组成员才能发言,加入小组>>
如何使用STM32+nrf24l01架构把有线USB设备无线化?
2487 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2271 浏览 5 评论
3065 浏览 3 评论
2733 浏览 8 评论
为什么ucosii上移植lwip后系统进入了HardFault_Handler?
2694 浏览 4 评论
请教各位大咖:有没有接收频率32M左右的芯片推荐的?先感谢啦!
497浏览 1评论
756浏览 0评论
845浏览 0评论
534浏览 0评论
341浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-10-2 06:07 , Processed in 0.886908 second(s), Total 52, Slave 46 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号