最近在做以太网的通信,使用的是探索者的板子,FREERTOS+SOCKET+TCP实现板子作为客户端传输数据,现在就是速度只能达到20Mbps,照100Mbps还差很多。试了网上的很多方法,更改opt.h里面的各种参数,比如 https://blog.csdn.net/kh766200466/article/details/104040100 还有https://blog.csdn.net/sinat_31039061/article/details/104751278,但是没有效果。这是以太网传输的代码。求帮助
#include "client.h"
#include "lwip/opt.h"
#include "lwip/sys.h"
#include "lwip/api.h"
#include <lwip/sockets.h>
#include "err.h"
#include "cc.h"
#include "FreeRTOS.h"
#include "task.h"
#define DEST_IP_ADDR0 10
#define DEST_IP_ADDR1 13
#define DEST_IP_ADDR2 21
#define DEST_IP_ADDR3 24
#define LWIP_DEMO_RX_BUFSIZE 1024 /* 最大接收数据长度 */
#define DEST_PORT 8080 /*端口号*/
uint8_t g_lwip_send_flag;
uint8_t g_lwip_connect_state = 0;
int sock = -1;
//#define IP_ADDR 10.13.21.24
void client(void *thread_param)
{
struct sockaddr_in client_addr;;
ip4_addr_t ipaddr;
int recv_data_len;
char *recv_data; //定义接收
printf("端口号:%d\n\n",DEST_PORT);
// IP4_ADDR(&ipaddr,10,13,21,24); //开发板连接交换机的地址
IP4_ADDR(&ipaddr,1,1,1,1); //开发板与电脑直连的地址
recv_data = (char *)pvPortMalloc(LWIP_DEMO_RX_BUFSIZE); //给接收申请内存
if(recv_data == NULL)
{
printf("NO MRMORY\r");
goto exit;
}
while(1)
{
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0)
{
// printf("Socket error\n");
vTaskDelay(10);
free(recv_data);
continue;
}
client_addr.sin_family = AF_INET;
client_addr.sin_port = htons(DEST_PORT);
client_addr.sin_addr.s_addr = ipaddr.addr;
memset(&(client_addr.sin_zero), 0, sizeof(client_addr.sin_zero));
if(connect(sock, (struct sockaddr *)&client_addr, sizeof(struct sockaddr)) == -1)
{
closesocket(sock);
free(recv_data);
vTaskDelay(10);
continue;
}
printf("Connect to server successful!\n");
g_lwip_connect_state = 1;
while(1)
{
memset(recv_data,0,LWIP_DEMO_RX_BUFSIZE); //每次开始接受之前清除一下接收缓存里的数据
recv_data_len = recv(sock, recv_data, LWIP_DEMO_RX_BUFSIZE, 0);
if(recv_data_len < 0)
{
free(recv_data);
break;
}
// write(sock,recv_data,sizeof(recv_data));
write(sock,recv_data,recv_data_len);
}
closesocket(sock);
}
exit:
if (sock >= 0) closesocket(sock);
if (recv_data) free(recv_data);
}
void client_init(void)
{
sys_thread_new("client", client, NULL, 512, 4);
}