Jump to content
    

LwIP помогите новичку

С LwIP только начал работать. Микроконтроллер STM32F407, точнее его китайский клон от Geehy. Информации в сети мало и очень скудная. В целом всё запустил, но остались две проблемы:

1. Принимает только 8 пакетов до перезагрузки. После перезапуска МК снова 8 принимает. После 8 не заходит в функцию Callbackа приёма, у меня это tcp_client_recv. Куда копать?

2. При отправке нет понимания что пакет ушёл и можно слать следующие данные. В результате если разом много пакетов (больше 12) отсылаю быстро, то всё что больше 12 не отправляются. Как понять что данные все отправились и буфер LwIP пуст? 

Прерывания по эзернету никакие не включены, работа идёт постоянным вызовом в main -  ethernetif_input(&gnetif);

Share this post


Link to post
Share on other sites

On 6/14/2025 at 8:14 AM, IgorAVR2 said:

С LwIP только начал работать.

В функции  tcp_client_recv после обработки полученных данных надо вызвать пару функци

tcp_recved(tpcb, p->tot_len);
pbuf_free(p);
Quote

This function should be called by the application when it has processed the data. The purpose is to advertise a larger window when the data has been processed.

Parameters
pcb the tcp_pcb for which data is read
len the amount of bytes that have been read by the application

Для оправки надо сначала вызвать

tcp_write(...);
Quote

Write data for sending (but does not send it immediately).

It waits in the expectation of more data being sent soon (as it can send them more efficiently by combining them together). To prompt the system to send data now, call tcp_output() after calling tcp_write().

А потом 

tcp_output(...);

https://www.nongnu.org/lwip/2_0_x/

Share this post


Link to post
Share on other sites

49 minutes ago, dimka76 said:

В функции  tcp_client_recv после обработки полученных данных надо вызвать пару функци

tcp_recved(tpcb, p->tot_len);
pbuf_free(p);

Для оправки надо сначала вызвать

tcp_write(...);

А потом 

tcp_output(...);

https://www.nongnu.org/lwip/2_0_x/

Спасибо вам большое. Проблему с приёмом данных помогли решить. Я не делал: pbuf_free(p);

А вот с отправкой то осталась. Проблема с отправкой не в том что у меня не отправляется, у меня всё отправляется. Отправку делаю так:

 

tcp_sent(client_pcb, tcp_client_sent);
tcp_write(client_pcb, (void*)data, data_size, 1);
tcp_output(client_pcb);

Оно всё уходит. Но я не не знаю как узнать ушло ли оно и могу ли отправлять следующие данные. В этом проблема.

Share this post


Link to post
Share on other sites

On 6/14/2025 at 6:14 PM, IgorAVR2 said:

А вот с отправкой то осталась. Проблема с отправкой не в том что у меня не отправляется, у меня всё отправляется. Отправку делаю так:

 

tcp_sent(client_pcb, tcp_client_sent);
tcp_write(client_pcb, (void*)data, data_size, 1);
tcp_output(client_pcb);

Оно всё уходит. Но я не не знаю как узнать ушло ли оно и могу ли отправлять следующие данные. В этом проблема.

tcp_sent не надо каждый раз вызывать, она как раз служит для назначении функции обратного вызова при успешной отправке.
В итоге, при успешной отправке у вас будет вызвана ваша функция tcp_client_sent.

Quote

◆ tcp_sent()

void tcp_sent ( struct tcp_pcb  pcb,
    tcp_sent_fn  sent 
  )    

Used to specify the function that should be called when TCP data has been successfully delivered to the remote host.

Parameters
pcb tcp_pcb to set the sent callback
sent callback function to call for this pcb when data is successfully sent

https://www.nongnu.org/lwip/2_0_x/group__tcp__raw.html#ga1596332b93bb6249179f3b89f24bd808

Share this post


Link to post
Share on other sites

Я попробовал как вы советуете, но tcp_client_sent вызывается намного меньше, чем реально пакетов было отправлено. А именно, отправляю 10 коротких пакетов, они все уходят (получаю на компе), а функция вызывается только два раза. Если делаю отправку этих 10 с точной остановки каждый раз, то функция вызывается 8 раз. Опят нет какого либо контроле ушли они или нет.

Share this post


Link to post
Share on other sites

On 6/14/2025 at 8:05 PM, IgorAVR2 said:

Я попробовал как вы советуете, но tcp_client_sent вызывается намного меньше, чем реально пакетов было отправлено. А именно, отправляю 10 коротких пакетов, они все уходят (получаю на компе), а функция вызывается только два раза. Если делаю отправку этих 10 с точной остановки каждый раз, то функция вызывается 8 раз. Опят нет какого либо контроле ушли они или нет.

Посмотрите ваши транзакции с помощью программы Wireshark.
Обратите внимание на подтверждения отправленных вами пакетов.
Сравните количество подтверждений с количеством вызовов  tcp_client_sent

Share this post


Link to post
Share on other sites

47 minutes ago, dimka76 said:

Посмотрите ваши транзакции с помощью программы Wireshark.
Обратите внимание на подтверждения отправленных вами пакетов.
Сравните количество подтверждений с количеством вызовов  tcp_client_sent

Спасибо вам огромное!!! С ваших подсказок решил обе свои проблемы. Вторую проблему решил тем что добавил дополнительный флаг, который означает что "передатчик" занят и не шлю следующие данные пока не вызовется tcp_client_sent  и там не сбросится этот флаг. И только после этого шлю следующие данные. А до этого все пакеты слал разом, не дожидаясь подтверждения.

А то прям пару дней сидел весь в расстройстве и не знал как подступиться.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...