0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 87
|
|
1 | |
Проблема STM32F4+lwIP07.09.2014, 02:26. Показов 14369. Ответов 7
Метки нет (Все метки)
Доброй ночи уважаемые форумчаны.
Начал разбираться с Ethernet под STM32F4. В качестве TCP/IP стека выбрал lwIP. Работаю в CooCox без FriiRTOS. Понятное дело скачал примеры от STM. Перенес в свой IDE все работает отлично ( у меня платко от Olimex так что даже паять ничего не пришлось )) ). Потом начал делать свой пример - простой сервер (самый простой). Скачал документалку от WiKi. Сделал согласной ей + скопировал часть с примера СТМ. Тут начались проблемы - после того как удаленный клиент установил свзь с моим сервером, я перехожу в accept_callback. В этой функции я согласно документации устанавливаю callback для приема и передачи информации. Проверяю все через Hercules. Когда я создаю соединения Hercules пишет что оно отклонено удаленным хостом (тоесть моей платкой). Путем вычитания понял, что как только Я ПРОБУЮ В accept_callback ЗАДАТЬ callback ДЛЯ ПРИЕМА ИЛИ ПЕРЕДАЧИ (ЛЮБОЙ callback) LWIP СРАЗУ РАЗРЫВАЕТ СОЕДИНЕНИЯ. НО ЕСЛИ ИЗ accept_callback ЗАДАТЬ ЛЮБОЙ callback И ПЕРЕДАТЬ ЧТО ТО В СТОРОНУ КЛИЕНТА - ВСЕ РАБОТАЕТ. ((( вот такой вот бред (((.. Борюсь уже 4 дня - и никак (( Вот мой код: настройка и инициилизация: NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); ETH_BSP_Config(); LwIP_Init(); tcp_server_connect(80, 192, 168, 8, 43); // порт 80 - потому что хочу создать веб - сервер while (1) { if (ETH_CheckFrameReceived()) { LwIP_Pkt_Homdle(); } LwIP_Periodic_Homdle(LocalTime); } } функция создания ожидания подключения -tcp_server_connect : // ----------функция tcp_server_connect--------------------------- // Серверная установка связи - ожидание установки соединения с клиентом void tcp_server_connect(u16 port, u8 dest_ip_fild1, u8 dest_ip_fild2, u8 dest_ip_fild3, u8 dest_ip_fild4){ struct ip_addr dest_ip; err_t rez_err_t; tcp_server_pcd=tcp_new(); // создаю структуру подключения по tcp протоколу rez_err_t=tcp_bind(tcp_server_pcd, IP_ADDR_ANY,port); // заполняю поля структуры подключения. Подключиться может хост с любим ІР tcp_server_pcd_1=tcp_listen(tcp_server_pcd); tcp_accept(tcp_server_pcd_1,tcp_server_accept_callback); // присваиваем серверу callback события: присоединился клиент функция accept_callback: // ---------Callback для функции соединения клиента к серверу------------------- void tcp_server_accept_callback(void * arg, struct tcp_psb * newpsb,err_t err){ ftoot rez_mes; u16 max_send_data; u16 firest_part, second_part; tcp_accepted(newpsb); tcp_sent(newpsb,tcp_server_send_callback); // функция которая вызываеться когда сервер присылает подтверждения приема ВОТ ЗДЕСЬ ВСЕ ЗЛО И КРОЕТЬСЯ !!!! КАК ТОЛЬКО ВІЗІВАЮ ЭТУ (ИЛИ СЛЕДУЮЩУЮ) ФУНКЦИЮ - РАЗРЫВ СОЕДИНЕНИЯ (( tcp_recv(newpsb,tcp_server_recive_callback); }
0
|
07.09.2014, 02:26 | |
Ответы с готовыми решениями:
7
STM32F4+PHY+FREERTOS+LWIP+UDP скорость LwIP STM32F4 перестает отвечать через время STM32F4 + fatfs проблема (ошибка FR_NO_FILESYSTEM) stm32f4 discovery - проблема с работой USB Host. |
1 / 1 / 0
Регистрация: 30.12.2013
Сообщений: 192
|
|
07.09.2014, 11:56 | 2 |
У меня не возникало проблем с использованием стандартного примера, поэтому не вдавался во все подробности, но чтобы разобраться: а как должно быть?
Броузер посылает запрос и ждёт ответ. Как вы определяете, что идёт разрыв соединения? Идёте в отладке по шагам? Но ведь тогда превышаются все интервалы ожидания.
0
|
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 87
|
|
07.09.2014, 16:11 | 3 |
Все очень просто.
Для отладки я использую программу Hercules. В ней можно задать кем выступает приложение (сервер или клиент), задать IP сервера (в моем случаи Hercules - клиент), порт и установить соединения. Далее программка сама покажет вам установлено ли соединение или нет. Если устновлено, можно обмениваться данными как через обычную сериальную програму (ComPortToolkit). Отладка в контроллере тут ничем не поможет. Так вот, Hercules показывает что соединение сначала устанавливаеться, а потом удаленный хост (тоесть СТМ) его разрываает. И это происходит в тех случаях, когда в каллбэке соединения я задаю калбэк для приема и передачи...
0
|
1 / 1 / 0
Регистрация: 30.12.2013
Сообщений: 192
|
|
07.09.2014, 16:51 | 4 |
Так а сами функции то - tcp_server_send_callback, tcp_server_recive_callback - что делают? Я имею ввиду их содержимое. Если берёте стандартные примеры, то там в конце будет что-то вроде tcp_close. И это нормально - веб-сервер не держит соединения открытыми, в отличии от сокетов, например.
0
|
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 87
|
|
07.09.2014, 17:28 | 5 |
функции tcp_server_send_callback, tcp_server_recive_callb мои (тоесть написаны мною). Соединения я не разрываю, да и не вызываються они до тех пор пока я что то не передам, или клиент не передаст. Странно как то... Скорее всего мат часть... )))
0
|
1 / 1 / 0
Регистрация: 30.12.2013
Сообщений: 192
|
|
07.09.2014, 20:50 | 6 |
Тогда наоборот попробуйте пошаговую отладку стека, может станет яснее.
0
|
0 / 0 / 0
Регистрация: 20.06.2010
Сообщений: 454
|
|
07.09.2014, 21:48 | 7 |
Сообщение от Kooddjomp
Там есть все нужные FIN - FIN,ACK или RST,PUSH ? Может быть у вас просто крашится прошивка? Возьмите еще раз пример с tcp-echo-server с сайта STM и посмотрите что и как.
0
|
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 87
|
|
08.09.2014, 11:48 | 8 |
да вот как раз вчера курочил tcp-echo-server с сайта STM. Этот пример работает, все нормально.
Но как только закоментировать строчку tcp_arg(newpsb, es); в калбеке: static err_t tcp_echoserver_accept(void *arg, struct tcp_psb *newpsb, err_t err) результат тот же ))). Что странно, потому что tcp_arg всего лишь описывает переменную которая будет передаваться в каждый калбек в качестве входного аргумента void* arg. Почему я решил что соединения разрывает удаленный сервер (то есть моя платка) ?? Потому что терминальная программа выдает сообщение: Connecting to 192.168.8.94 ... Connected to 192.168.8.94 Connection refused by remote host Connection closed что означает: пробую соединиться соединился Соединение отклонено удаленным хостом соединение закрыто ........
0
|
08.09.2014, 11:48 | |
08.09.2014, 11:48 | |
Помогаю со студенческими работами здесь
8
STM32f4 SD DMA проблема с адресом глобальной перменной STM32F4 USB VCP проблема TimeOut-а при передачи данных от PC LwIP http без LwIP стека STM32F4 freertos + lwip + mqtt + mbedtls STM32F4 + CAN: проблема LWIP Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |