В указанном примере как раз таки MAC и ip адреса вбиваются вручную, все хидеры lwip проставляет автоматически, все что остается это засунуть данные в payload.
По советам jcxz решил, что надо добавлять в проект и RTOS.
Из той информации, которую изучил на данный момент, имею следующее представление:
1. Создаю 2 задачи. В первой провожу инициализацию АЦП и в бесконечном цикле отправляю запрос на единичное преобразование, записывая результат в соответствующий элемент структуры и ставя её в очередь.
Примерный код:
Код
// Добавляю глобальную переменную для очереди //
osMailQId strout_Queue
// Указываю размер очереди //
#define MAIL_SIZE (uint32_t) 1 // Насколько я понимаю, чтобы гарантированно передать по ethernet значение преобразования, в очереди должен быть всего 1 элемент, соответственно если она заполнена, то первая задача находится в блокированном состоянии
// Задаю структуру с данными //
typedef data_t {
int32_t temperature;
uint8_t time;
uint8_t date;
} data;
// Создаю задачу RTOS //
osThreadDef(ADC, StartTaskADC, osPriorityNormal, 0, 128);
ADCHandle = osThreadCreate(osThread(ADC), NULL);
// Создаю очередь //
osMailQDef(stroutqueue, MAIL_SIZE, data;
strout_Queue = osMailCreate(osMailQ(stroutqueue), NULL);
// Создаю функцию первой задачи //
void StartTaskADC(void const * argument)
{
/* USER CODE BEGIN StartTaskADC */
struct_out *qstruct; // добавляю переменную типа передаваемой в очереди структуры
ADC_Init; // выполняю инициализацию АЦП (отправляю набор команд по SPI, использую функцию HAL_SPI_Transmit, можно ли взять её или для таких применений нужно с DMA каким-нибудь?)
/* Infinite loop */
for(;;)
{
qstruct = osMailAlloc(strout_Queue, osWaitForever); // выделяю память под очередь
qstruct->temperature = ADC_ReadValue; // записываю в элемент структуры temperature полученное значение из АЦП (посылаю команду единичного преобразования через HAL_SPI_Transmit, аналогичный вопрос)
qstruct->time = 1 // записываю в элемент структуры time рандомное значение (пока не важно)
qstruct->date = 2 // записываю в элемент структуры date рандомное значение (пока не важно)
osMailPut(strout_Queue, qstruct); // отправляю структуру в очередь
osDelay(1);
}
/* USER CODE END StartTaskADC */
}
2. Создаю вторую задачу, которая будет инициализировать UDP, получать измеренное значение температуры из очереди и отправлять его.
Код
// Создаю глобальные переменные структур, требующихся для передачи по ethernet //
extern struct netif gnetif;
static struct udp_pcb *udp_Pcb1_p;
// Создаю задачу RTOS //
osThreadDef(ETH, StartTaskETH, osPriorityNormal, 0, 128);
ETHHandle = osThreadCreate(osThread(ETH), NULL);
// Создаю функцию второй задачи //
void StartTaskETH(void const * argument)
{
/* USER CODE BEGIN StartTaskETH */
osEvent event; // добавляю переменную типа структуры состояния очереди
struct_out *qstruct; // добавляю переменную типа передаваемой в очереди структуры
UDP_Init; // выполняю инициализацию UDP (в ней создается новое подключение UDP (udp_new), вручную записывается mac и ip адрес компа, биндится соединение (udp_bind) и проверяется на наличие ошибок)
/* Infinite loop */
for(;;)
{
static const char packet[]; // создаю переменную для данных, которые буду класть в payload
event = osMailGet(strout_Queue, osWaitForever); // забираю данные из очереди
if (event.status == osEventMail) // проверяю состояние очереди
qstruct = event.value.p; // присваиваю переменной типа структуры очереди указатель на элемент очереди
packet[] = qstruct->temperature, qstruct->time, qstruct->date; // записываю полученные данные в переменную для payload
SendPacket; // вызываю функцию отправки udp (здесь указывается ip адрес клиента, создается буффер для передачи по eth, в который заносим вышеуказанный packet[], заносим все это в payload и отправляем (udp_sendto)
ethernetif_input(&gnetif); // вписываю стандартный код для обеспечения постоянной работы стека
sys_check_timeouts; // продолжение... (говорят, что эти 2 строки можно заменить MX_LWIP_Process() тогда и extern struct netif gnetif не нужно, но пока попробую запуститься так)
osDelay(1);
}
/* USER CODE END StartTaskETH */
}
Где-то что-то упустил или вообще все кардинально неправильно?))
Сообщение отредактировал remixx - May 16 2018, 07:03