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

 
 
> LwIP TCP-сервер и UDP-клиент на одном MCU+LAN8720A?
Pridnya
сообщение Oct 21 2016, 06:10
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159



Всем привет!

Проект без операционной системы с LwIP-стеком (low-level "core" / "callback" or "raw" API) на одном микроконтроллере (основная программа + TCP-сервер (Modbus TCP)), работает.

Меня интересует, можно ли в этот проект добавить еще и UDP-клиент (SNTP-клиент) и не будет ли TCP-сервер конфликтовать с UDP-клиентом?
По отдельности TCP-сервер работает, UDP-клиент работает, а как все вместе совместить (в проект c TCP-сервером добавить UDP-клиент)? Я еще с такой задачей не сталкивался, поэтому сильно не ругайте.

Если что, то в качестве PHY используется LAN8720A, разъем RJ45 один, проект на STM32, но микроконтроллер пока не важен, меня интересует сама возможность совмещения серера и клиента.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kolobok0
сообщение Oct 25 2016, 00:03
Сообщение #2


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Pridnya @ Oct 21 2016, 09:10) *
...можно ли в этот проект добавить еще и UDP-клиент (SNTP-клиент) и не будет ли TCP-сервер конфликтовать с UDP-клиентом?
... а как все вместе совместить (в проект c TCP-сервером добавить UDP-клиент)?...меня интересует сама возможность совмещения серера и клиента.


1) можно, не будет. т.к. см. выше моё предыдущий пост. Или скажем по другому => в RFC если это не запрещено - то однозначно МОЖНО.
2) пишется обработчик и разбор одного протокола, потом второго. Можно взять кота в мешке, тьху готовый серый ящик. Можно сделать его прозрачным,
можно вообще по мотивам написать более скоростной и компактный - тут поле для творчества вагон и маленькая кружка.
3) Ваш проект (с точки зрения наполнения логикой) очень и очень прост. Кстати совет дня (попробуйте написать модбас сервер, чтоб можно потом только декларотивно добавлять сколько
угодно функций-адресов) Поверьте - у Вас много кода сократиться... wink.gif

я всё правильно ответил на поставленные Вами вопросы?
только боюсь Вам от этого вряд-ли полегчало...

удачи Вам
(круглый)
Go to the top of the page
 
+Quote Post
Pridnya
сообщение Nov 3 2016, 07:59
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159



Цитата(kolobok0 @ Oct 25 2016, 03:03) *
1) можно, не будет. т.к. см. выше моё предыдущий пост. Или скажем по другому => в RFC если это не запрещено - то однозначно МОЖНО.
2) пишется обработчик и разбор одного протокола, потом второго. Можно взять кота в мешке, тьху готовый серый ящик. Можно сделать его прозрачным,
можно вообще по мотивам написать более скоростной и компактный - тут поле для творчества вагон и маленькая кружка.
3) Ваш проект (с точки зрения наполнения логикой) очень и очень прост. Кстати совет дня (попробуйте написать модбас сервер, чтоб можно потом только декларотивно добавлять сколько
угодно функций-адресов) Поверьте - у Вас много кода сократиться... wink.gif

я всё правильно ответил на поставленные Вами вопросы?
только боюсь Вам от этого вряд-ли полегчало...

удачи Вам
(круглый)

Можно было так с самого начала и написать.
На счет Modbus: я примерно к этому и пришел, вот кусочек для ModbusRTU, он упрощает процесс: достаточно добавить в файл новую функцию и зарегистрировать её в таблице:
Код
// *************************************************************************** //
typedef  uint16_t  (* FUNC)(int8_t *Buf);

typedef struct {
    int8_t const idx; // Индекс функции таблице.
    int8_t const cmd; // Код функции.
    FUNC    func;     // Функция.
}COMMAND;
// *************************************************************************** //
uint16_t Exception(int8_t *Buf);
uint16_t WriteMultipleRegisters(int8_t *Buf);
uint16_t ReadHoldingRegisters(int8_t *Buf);

// Индекс, код функции, функция.
const COMMAND    cmds[] =
    {
    { 0, 0x00, Exception},   // Функция не поддерживается.
    { 1, 0x03, ReadHoldingRegisters},  // Чтение регистров.
    { 2, 0x10, WriteMultipleRegisters},  // Запись регистров.
};
// *************************************************************************** //
void Process(int8_t *Buf)
{  
    int8_t code = Buf[1];       // Код функции.
    int8_t i = FindIdx(code);   // Индекс.
    ...
    Size = cmds[i].func(Buf);
    ...
}
// *************************************************************************** //


Всем спасибо! Т.е. запустить на одном микроконтроллере TCP-сервер и UDP-клиент можно и примеры есть.

Сообщение отредактировал Pridnya - Nov 3 2016, 08:02
Go to the top of the page
 
+Quote Post
Pridnya
сообщение Nov 3 2016, 12:10
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 11-01-11
Из: Орел
Пользователь №: 62 159



Оказалось все проще простого: достаточно добавить два файла:
udp_client.h
void udp_echoclient_connect(void); // с прототипом функции

udp_client.c
с двумя функциями (функции из примера udp_echo_client):
void udp_echoclient_connect(void){...}
void udp_receive_callback(...){...}

В настройках проекта указать IP-адрес и порт UDP-сервера на стороне компьютера (IP=192.168.1.10, #define UDP_SERVER_PORT 7).

В файле main.c (или в любом другом) периодически, например через 4 секунды, вызываем функцию void udp_echoclient_connect(void);

Собираем проект, прошиваем микроконтроллер.
На стороне компьютера запускаем:
1) для проверки работы UDP-клиента в командной строке программу echotool с параметрами: echotool.exe /p udp /s 7
2) для проверки работы ModbusTCP-сервера - любой ModbusTCP-клиент (соединяемся с IP 192.168.1.101, TCP-порт 502).
Оба работают и не мешают друг другу.

Остался вопрос: как теперь заменить UDP-клиент на SNTP-клиент (SNTP-клиент работает как UDP-клиент, но есть свои особенности).
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Pridnya   LwIP TCP-сервер и UDP-клиент на одном MCU+LAN8720A?   Oct 21 2016, 06:10
- - scifi   Цитата(Pridnya @ Oct 21 2016, 09:10) Меня...   Oct 21 2016, 07:14
|- - Pridnya   Цитата(scifi @ Oct 21 2016, 10:14) Не пре...   Oct 21 2016, 08:01
|- - Pridnya   Цитата(scifi @ Oct 21 2016, 10:14) Не пре...   Oct 21 2016, 13:23
- - kolobok0   Цитата(Pridnya @ Oct 21 2016, 09:10) ...с...   Oct 22 2016, 08:33
|- - Pridnya   Цитата(kolobok0 @ Oct 22 2016, 11:33) лог...   Oct 24 2016, 05:25
|- - HardEgor   Цитата(Pridnya @ Oct 24 2016, 12:25) Вы п...   Oct 24 2016, 06:31
|- - Pridnya   Цитата(HardEgor @ Oct 24 2016, 09:31) Да ...   Oct 24 2016, 07:23
|- - HardEgor   Цитата(Pridnya @ Oct 24 2016, 14:23) Упом...   Oct 24 2016, 07:56
|- - Pridnya   Цитата(HardEgor @ Oct 24 2016, 10:56) т.е...   Oct 24 2016, 08:32
||- - mantech   Цитата(Pridnya @ Oct 24 2016, 11:32) Серг...   Oct 25 2016, 12:16
||- - Pridnya   Цитата(mantech @ Oct 25 2016, 15:16) Сорр...   Oct 31 2016, 11:01
|- - Pridnya   Цитата(HardEgor @ Oct 24 2016, 10:56) т.е...   Oct 24 2016, 09:36
- - scifi   Lwip - это такая штука, про которую нужно знать, к...   Oct 24 2016, 07:34
|- - Pridnya   Цитата(scifi @ Oct 24 2016, 10:34) Lwip -...   Oct 24 2016, 07:46
|- - Сергей Борщ   QUOTE (Pridnya @ Oct 24 2016, 11:32) Я за...   Oct 24 2016, 10:00
- - krounis   Цитата(Pridnya @ Oct 21 2016, 13:10) Всем...   Jan 25 2018, 11:03


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

 


RSS Текстовая версия Сейчас: 18th August 2025 - 04:42
Рейтинг@Mail.ru


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