IgorAVR2 1 June 14, 2025 Posted June 14, 2025 · Report post С LwIP только начал работать. Микроконтроллер STM32F407, точнее его китайский клон от Geehy. Информации в сети мало и очень скудная. В целом всё запустил, но остались две проблемы: 1. Принимает только 8 пакетов до перезагрузки. После перезапуска МК снова 8 принимает. После 8 не заходит в функцию Callbackа приёма, у меня это tcp_client_recv. Куда копать? 2. При отправке нет понимания что пакет ушёл и можно слать следующие данные. В результате если разом много пакетов (больше 12) отсылаю быстро, то всё что больше 12 не отправляются. Как понять что данные все отправились и буфер LwIP пуст? Прерывания по эзернету никакие не включены, работа идёт постоянным вызовом в main - ethernetif_input(&gnetif); Quote Share this post Link to post Share on other sites More sharing options...
dimka76 89 June 14, 2025 Posted June 14, 2025 · Report post 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/ Quote Share this post Link to post Share on other sites More sharing options...
IgorAVR2 1 June 14, 2025 Posted June 14, 2025 · Report post 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); Оно всё уходит. Но я не не знаю как узнать ушло ли оно и могу ли отправлять следующие данные. В этом проблема. Quote Share this post Link to post Share on other sites More sharing options...
dimka76 89 June 14, 2025 Posted June 14, 2025 · Report post 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 Quote Share this post Link to post Share on other sites More sharing options...
IgorAVR2 1 June 14, 2025 Posted June 14, 2025 · Report post Я попробовал как вы советуете, но tcp_client_sent вызывается намного меньше, чем реально пакетов было отправлено. А именно, отправляю 10 коротких пакетов, они все уходят (получаю на компе), а функция вызывается только два раза. Если делаю отправку этих 10 с точной остановки каждый раз, то функция вызывается 8 раз. Опят нет какого либо контроле ушли они или нет. Quote Share this post Link to post Share on other sites More sharing options...
dimka76 89 June 14, 2025 Posted June 14, 2025 · Report post On 6/14/2025 at 8:05 PM, IgorAVR2 said: Я попробовал как вы советуете, но tcp_client_sent вызывается намного меньше, чем реально пакетов было отправлено. А именно, отправляю 10 коротких пакетов, они все уходят (получаю на компе), а функция вызывается только два раза. Если делаю отправку этих 10 с точной остановки каждый раз, то функция вызывается 8 раз. Опят нет какого либо контроле ушли они или нет. Посмотрите ваши транзакции с помощью программы Wireshark. Обратите внимание на подтверждения отправленных вами пакетов. Сравните количество подтверждений с количеством вызовов tcp_client_sent Quote Share this post Link to post Share on other sites More sharing options...
IgorAVR2 1 June 14, 2025 Posted June 14, 2025 · Report post 47 minutes ago, dimka76 said: Посмотрите ваши транзакции с помощью программы Wireshark. Обратите внимание на подтверждения отправленных вами пакетов. Сравните количество подтверждений с количеством вызовов tcp_client_sent Спасибо вам огромное!!! С ваших подсказок решил обе свои проблемы. Вторую проблему решил тем что добавил дополнительный флаг, который означает что "передатчик" занят и не шлю следующие данные пока не вызовется tcp_client_sent и там не сбросится этот флаг. И только после этого шлю следующие данные. А до этого все пакеты слал разом, не дожидаясь подтверждения. А то прям пару дней сидел весь в расстройстве и не знал как подступиться. Quote Share this post Link to post Share on other sites More sharing options...