weixin_68245420 2023-03-13 18:31 采纳率: 0%
浏览 15

以太网传输速度达不到要求

最近在做以太网的通信,使用的是探索者的板子,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);
}

  • 写回答

2条回答 默认 最新

  • 琉底骅网络 海口龙华琉底骅网络科技工作室官方账号 2023-03-13 19:02
    关注

    从代码中可以看出,在每次接收数据之前都调用了 memset 函数,清空了接收缓存中的数据,增加了接受大量数据的处理能力。此外,代码中通过调用 FreeRTOS 的系统接口来移植到了嵌入式系统中,也说明其在资源占用和处理效率上存在优化。如果需要支持更高的传输速率,可能需要注意以下几个问题:
    1.确定硬件设备的速率等级:在使用工业以太网设备传输数据时,需要确定硬件设备的速率等级。某些工业以太网设备可能只支持 10Mbps 的传输速率,而不支持 100Mbps 的传输速率。
    2.确定传输协议和网络拓扑:工业以太网常常需要使用不同的传输协议和网络拓扑结构。例如,请根据网络拓扑和传输协议的要求选择嵌入式系统中的网络堆栈。
    3.确定数据缓存和处理能力:对于大数据的传输,需要保证系统具有足够的数据缓存和处理能力。数据缓存空间足够能够存储完整的传输数据包,可通过增加缓存空间来提升数据处理能力。在数据处理过程中,需要对数据进行验证和过滤,防止出现异常情况导致丢失数据或崩溃。
    这些是实现高速工业以太网数据传输的一些要点,希望能帮到你

    评论

报告相同问题?

问题事件

  • 创建了问题 3月13日

悬赏问题

  • ¥18 关于#贝叶斯概率#的问题:这篇文章中利用em算法求出了对数似然值作为概率表参数,然后进行概率表计算,这个概率表是怎样计算的呀
  • ¥15 Android Navigation: 某XDirections类不能自动生成
  • ¥20 C#上传XML格式数据
  • ¥15 elementui上传结合oss接口断点续传,现在只差停止上传和继续上传,各大精英看下
  • ¥100 单片机hardfaulr
  • ¥20 手机截图相片分辨率降低一半
  • ¥50 求一段sql语句,遇到小难题了,可以50米解决
  • ¥15 速求,对多种商品的购买力优化问题(用遗传算法、枚举法、粒子群算法、模拟退火算法等方法求解)
  • ¥100 速求!商品购买力最优化问题(用遗传算法求解,给出python代码)
  • ¥15 虚拟机检测,可以是封装好的DLL,可付费