реклама на сайте
подробности

 
 
> Низкая скорость передачи данных по TCP как быть?
TSURKOV
сообщение May 21 2013, 14:46
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 1-11-05
Пользователь №: 10 385



Низкая скорость передачи данных по TCP как быть?

Здравствуйте коллеги. Работаю с STM32F207, столкнулся с непонятной для меня ситуацией. Скорость передачи информации по протоколу tcpip в реализации lwip стека максимум до 120 килобайт в секунду (для сообщений длинной 512 байт). Пробовал менять длину пакетов, 512 байт кажется оптимальной. Принимает процессор куда быстрее, удавалось обмениваться со скоростями до 1000 килобайт в секунду. Пользовательских настроек стека не видел. В FareShark вижу что передает мои сообщения одним пакетом, и принимает тоже от PC одним пакетом. Вроде все одинаково но передача в 10 раз медленнее работает и мне это кажется очень странным. Кто-нибудь сталкивался с подобной ситуацией ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение May 22 2013, 16:19
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



у вас очень маленькое окно, получается частые перепосылы и остановки.

вы подтверждаете весь пакет? tcp_recived(....)
там буфер р имеет кроме p->len еще и p->total_len, и ссылки на след пакеты, может пока туда-суда окно и забилось?
Go to the top of the page
 
+Quote Post
TSURKOV
сообщение May 23 2013, 09:20
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 1-11-05
Пользователь №: 10 385



Цитата(Golikov A. @ May 22 2013, 19:19) *
у вас очень маленькое окно, получается частые перепосылы и остановки.

вы подтверждаете весь пакет? tcp_recived(....)
там буфер р имеет кроме p->len еще и p->total_len, и ссылки на след пакеты, может пока туда-суда окно и забилось?


Насколько я понимаю подтверждение tcp_recived это для случая когда процессор принимает. Во всяком случае я так делал.
Код
err_t tcp_client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
   // обработка принятого пакета
    
     tcp_recved(tpcb,p->tot_len);
     pbuf_free(p);

}

Для случая передачи я просто вызываю calback функцию tcp_sent(ptcp_pcb, tcp_client_sent)
Хотя ее смысл мне не понятен (функцию взял из примера) в if программа не заходит.
Код
err_t tcp_client_sent(void *arg, struct tcp_pcb *tpcb, u16_t len)
{
  struct tcp_client_struct *es;

  LWIP_UNUSED_ARG(len);

  es = (struct tcp_client_struct *)arg;
  
  if(es->p_tx != NULL)
  {
    tcp_client_send(tpcb, es);
  }

  return ERR_OK;
}

вообще мой обработчик передачи крутится в основном цикле и выглядит примерно так
Код
void SendDataHandler(void)
{

   // запаковка данных
      
      if(tcp_sndbuf(ptcp_pcb) >= msg_len)
      {
        err = tcp_write(ptcp_pcb,&tx_tcp_msg,msg_len,1);
        tcp_sent(ptcp_pcb, tcp_client_sent);  
      }
}

если err == ERR_OK значит данные переданы.

Сообщение отредактировал IgorKossak - May 23 2013, 12:51
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
TSURKOV
сообщение May 23 2013, 13:19
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 1-11-05
Пользователь №: 10 385



скриншот wareshark. Такое впечатление, что процессор не получает некоторые подтверждения от PC и повторно шлет пакеты. Что и снижает общую скорость.

Сообщение отредактировал TSURKOV - May 23 2013, 13:36
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st August 2025 - 21:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01403 секунд с 7
ELECTRONIX ©2004-2016