最近在做以太网的通信,使用的是探索者的板子,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
#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);
}
从代码中可以看出,在每次接收数据之前都调用了 memset 函数,清空了接收缓存中的数据,增加了接受大量数据的处理能力。此外,代码中通过调用 FreeRTOS 的系统接口来移植到了嵌入式系统中,也说明其在资源占用和处理效率上存在优化。如果需要支持更高的传输速率,可能需要注意以下几个问题:
1.确定硬件设备的速率等级:在使用工业以太网设备传输数据时,需要确定硬件设备的速率等级。某些工业以太网设备可能只支持 10Mbps 的传输速率,而不支持 100Mbps 的传输速率。
2.确定传输协议和网络拓扑:工业以太网常常需要使用不同的传输协议和网络拓扑结构。例如,请根据网络拓扑和传输协议的要求选择嵌入式系统中的网络堆栈。
3.确定数据缓存和处理能力:对于大数据的传输,需要保证系统具有足够的数据缓存和处理能力。数据缓存空间足够能够存储完整的传输数据包,可通过增加缓存空间来提升数据处理能力。在数据处理过程中,需要对数据进行验证和过滤,防止出现异常情况导致丢失数据或崩溃。
这些是实现高速工业以太网数据传输的一些要点,希望能帮到你
1,每次接收前用memeset来清空接收区没有意义
2,TCP是双向的,收发速度还取决于对方的速度和响应时间,你测试用的另一方是什么设备和软件?从你的测试方式看,是等待接收后原样发回,如果对方也是等你回了之后再发,理论上单向的最大速度也就50Mbps,扣除一些协议开销,还要稍微少点,如果每次发送的数据内容很短,那协议开销占的比例就会很高,速度甚至只能达到理论值的1%左右,建议测试发送每次在1000-1400字节。
3,STM32F407带硬件加速,包括自动校验和计算,建议开启,可以节约很大的CPU开销。
4,用wireshark抓包分析一下传输过程的延时,看收发双方是否存在延时较大的情况。另外看一些有没有错误导致的重传。重传会大大降低TCP的传输速度。
5,可以试试UDP发送,这个是单向的,应该很容易达到100Mbps