Поиск сообщества
Показаны результаты для тегов 'LWIP'.
Найдено: 3 результата
-
Здравствуйте, необходимо реализовать обмен данными между мк stm32 и пк посредством ethernet. МК передает данные с датчиков, АПЦ и тд, ПК передает управляющие сигналы - зажечь, потушить светодиод и тд. МК - stm32f746 dicovery, PHY - LAN8742. Предполагаю использовать CubeMX, соответственно HAL, т.к. stm32f7, IDE - STM32CubeIDE, в качестве стека LWIP без ОС (читал разные мнения относительно применения FreeRTOS при использовании LWIP, пока решил не прикручивать его сюда). Перечитал кучу информации, форумов, но ничего толком не нашел, что можно было бы использовать в качестве основы, т.к. с Ethernet сталкиваюсь впервые. Может кто сможет помочь информацией, как должна выглядеть архитектура такой программы, код, примеры? Вроде понимание теории есть, проблемы с реализацией.
-
Всем доброго В.С. Необходимо сейчас к уже готовому проекту по работе с двигателями, печатной головой, различными датчиками и интерфейсами подрубить сервер для, вот неожиданность, удаленного управления всей этой историей. Беда в том, что опыта с работой и настройкой сервера на микроконтроллерных платах у меня 0, ноль, зеро. В связи с чем и обращаюсь на данный форум с просьбой направить меня на путь истинный и посоветовать с чего начать и чем закончить (необязательный пункт). И так, к сути. В наличии STM32F746IGT6 плата с Cortex M7 на борту и хардверной поддержкой Ethernet, разумеется. По скорости, объему памяти и прочему, я думаю смысла расписывать нет. Это целый набор разработчика с кучей периферии (экран, камера, плата с RG-45 разъемом и т.д.) . На ней-то я и планирую развернуть простейший сервер БЕЗ Web страницы (ибо есть десктопное приложение для взаимодействия с платой по методу отправки POST запросов и получения ответов после получения запроса). В наборе со всей этой красотой идет CD диск с КУЧЕЙ разных примеров для этой платы и несколькими примерами сервера в частности. В целом, подогнать готовый проект под необходимые нужды не составило труда - получаем запрос, распарсиваем его, получаем нужные значения и выполняем необходимые операции с механикой. Но тут-то и возникла первая проблема - ответ от сервера присылается в виде html-страницы, что и неудивительно, ведь она размещена на сервере и позволяет манипулировать светодиодами, а ответом является изменение инфы на странице после отправки запроса. Кое-как я заставил сервак не отправлять мне html страницу, а отправить заголовок о том, что все хорошо и данные валидны: HTTP/1.1 200 OK\r\n Content-Type: text/plain\r\nConnection: close\r\n\r\nData valid! Но ответ все равно присылается в файле, а строка в нем зацикливается до бесконечности, пока не остановишь его (не разобрался почему так, иногда только Data valid!, а иногда весь Request reply целиком). Вы скажите - "Так не отсылай ответ и все будет нормально"! Но нет, без ответа от сервера клиентское приложение не пустит нас дальше. Я бы и дальше пилил этот сервер, в недрах которого заплутают даже Гензель и Гретель, но вдруг осознал, что он перегружен всяким ненужным функционалом типа поддержки кастомной fsdata, get-запросов и т.д.). Вот и решил написать, так сказать, свой HTTP/HTTPS(в идеале) сервер с DHCP (без него ни куда), без WEB интерфейса, с поддержкой POST-запросов и без FREERTOS (ну вот так вот нужно) Вот только инфы в интернете оказалось недостаточно (пару примеров под Visual GDB и Keil). Я работаю под Keil и их примеры тоже не подходят, ибо опять-таки содержат тот самый fsdata (начинкой которого является html страница). Уважаемые, люди, может кто-то посоветует где наколядовать инфы о том, как развернуть простой сервер с +- таким же функционалом (получил post-запрос, ответил что получил, ждет опять посылку)? Может статьи или книженции, мануалы и т.п.? Заранее благодарю. Всем добра!
- 1 ответ
-
- STM32F746IGT6
- Ethernet
-
(и ещё 2 )
C тегом:
-
День добрый! Имеется sim-карта со статическим IP и модем SIM800C, который через UART соединен с STM32F0. Прочитав статью на хабре, которая и являлась отправной точкой, было решено повторить подвиг, но в версии lwip 2.0.3, которой я пользуюсь, ppp изменился до неузнаваемости, что сначала внесло некоторый сумбур. Но в документации к lwip был найден текстовый файл с настройкой ppp-соединения (ppp.txt, прикреплю его ниже), в котором было все, что нужно для счастья, но когда модем начал общаться с контроллером, дальше фазы LCP дело не зашло. Как я понял из документа (ppp_connect.docx), который оказался у меня уже-и-не-помню-откуда, после конфигурирования параметров соединения в фазе LCP контроллер должен посылать в модем пакет с заголовком PAP (C0 23), но он почему-то этого не делает... Он вообще больше ничего не делает. Я пытался проследить в отладчике весь путь запроса, что приходит от модема, но это только больше меня запутало. Собственно, прием данных у меня организован через прерывание. После ввода AT-команды "ATD*99***1#" и получения ответа "CONNECT", устанавливается флаг "ppp_enable" и при приходе байта он кладется в очередь `xQueue_PPP_Package`. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { uint8_t u8; if(huart == &huart1) { if (ppp_enable == true) { portBASE_TYPE xHigherPriorityTaskWoken_PPP_Rx; u8 = Sim800.UsartRxTemp; xHigherPriorityTaskWoken_PPP_Rx = pdFALSE; xQueueSendFromISR(xQueue_PPP_Package, &u8, &xHigherPriorityTaskWoken_PPP_Rx); } else { /*Reception of AT commands*/ } HAL_UART_Receive_IT(&huart1,&Sim800.UsartRxTemp,1); } } В задаче `StartLwIPTask` в бесконечном цикле проверяется эта очередь и при появлении элементов, записывает их в массив `PPPx.Data` и при фиксации второго HDLC-заголовка (0x7E), отправляет данные в lwip функцией `pppos_input`. P.S. Переменная `PPPx.Last_Index` это размер пришедшего ppp-пакета. void StartLwIPTask(void const * argument) { /* USER CODE BEGIN StartLwIPTask */ /*Создаем очередь*/ xQueue_Sim800_Package = xQueueCreate(128, sizeof(uint8_t)); xQueue_PPP_Package = xQueueCreate(128, sizeof(uint8_t)); uint8_t u8=0; volatile int setup = 0; tcpip_init( NULL, NULL ); /*Инициализация стека tcp/ip*/ /*Create a new PPPoS interface*/ ppp = pppos_create(&ppp_netif, output_cb, status_cb, 0); // /* Auth configuration, this is pretty self-explanatory */ ppp_set_auth(ppp, PPPAUTHTYPE_PAP, "beeline", "beeline"); /* Require peer to authenticate */ ppp_set_auth_required(ppp, 1); /*Only for PPPoS, the PPP session should be up and waiting for input.*/ ppp_set_silent(ppp, 1); /* * Initiate PPP listener (i.e. wait for an incoming connection), can only * be called if PPP session is in the dead state (i.e. disconnected). */ ppp_listen(ppp); /* Infinite loop */ for(;;) { if (sim800_init() == S_RESET) /*Настройка модуля Sim800*/ continue; for (;;) { if (pdPASS == xQueueReceive(xQueue_PPP_Package, &u8, 100/portTICK_RATE_MS)) { if (u8 == 0x7E) t++; PPPx.Data[PPPx.Last_Index++] = u8; if (t==2) { PPPx.Last_Index--; pppos_input(ppp, PPPx.Data, PPPx.Last_Index); t=0; memset(&PPPx, 0, sizeof(PPPx)); } } } } /* USER CODE END StartLwIPTask */ } Как я писал выше, все идет хорошо, пока идет фаза LCP, но после подтверждения контроллера запроса опций, наступает тишина. В интернете мне удалось найти довольно мало исчерпывающей информации и примеров по связке stm32+lwip+ppp, если кто-нибудь занимался подобным или сталкивался с похожей проблемой, буду очень признателен за помощь и за пинки в нужном направлении. Заранее спасибо. ppp.txt ppp_connect.docx