STM32H7 LWIP problem

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Úterý Září 3 10:51:54 CEST 2019


Zdravim, narazil jsem opet na problem - pokud pouze na strane STM 
prijimam, tak se prijem po pravidelnem poctu znaku (ale spis paketu po 
jednom znaku, myslim 144) sekne a z netconn_recv to uz nevypadne ani po 
uzavreni spojeni. Mam dojem, ze ani neblika LED na RJ45 ale dle 
wireshark PC data posila...

Pokud do MCU doplnim timeout, ze se spojeni po preruseni prijmu ukonci, 
da se znovu pripojit a jede to. Pokud prijem prokladam vysilanim, treba 
po 10 znacich, zda se to taky funkcni (to je ted v programu 
netconn_write...) po 100 znacich uz zase ne...

Nesetkal se s tim nekdo? Jako by se nekde neco neuvolnovalo ale uz me 
nenapada co pro to udelat.


#include "GlobalDefs.h"
#include "lwip/api.h"

static const char *tag = "MBN";

struct netconn *conn;
struct netconn *incconn = NULL;

void mbnetServer(void const * argument)
{
     struct netconn *incconn = (struct netconn *)argument;
     TERMLOG_I(tag, "Start Modbus TCP Task");
     int n = 0;
     for (;;)
     {
         struct netbuf *buf=NULL;
         err_t err = netconn_recv(incconn, &buf);
         if (err == ERR_OK)
         {
             do
             {
                 void *data;
                 uint16_t len;

                 /* obtain a pointer to the data in the fragment */
                 netbuf_data(buf, &data, &len);
                 uint8_t *c = (uint8_t *)data;
                 while (len != 0)
                 {
                     terminal_Out(TERMTG_ALL, TERMCOL_DEFAULT, "%c", *c);
                     if (++n % 10 == 0)
                     {
                         netconn_write(incconn, "*", 1, NETCONN_COPY);
                     }
                     c++;
                     len--;

                 }
             } while(netbuf_next(buf) >= 0);
             netbuf_delete(buf);
         }
         else
         {
             break;
         }
     }
     netconn_close(incconn);
     netconn_delete(incconn);
     TERMLOG_I(tag, "End Modbus TCP Task");
     vTaskDelete(NULL);
}

void mbnetMain(void const * argument)
{
     err_t err;
     conn = netconn_new(NETCONN_TCP);
     if (conn==NULL)
     {
         vTaskDelete(NULL);
         return;
     }
     err = netconn_bind(conn, NULL, 502);
     if (err != ERR_OK)
     {
         vTaskDelete(NULL);
         return;
     }
     /* Tell connection to go into listening mode. */
     err = netconn_listen_with_backlog(conn, 2);
     if (err != ERR_OK)
     {
         vTaskDelete(NULL);
         return;
     }
     for (;;)
     {
         struct netconn *newconn;
         err_t err = netconn_accept(conn, &newconn);
         if (err == ERR_OK)
         {
             TERMLOG_I(tag, "New Modbus TCP connection");
             osThreadDef(mbNetServer, mbnetServer, osPriorityNormal, 0, 
512);
             osThreadCreate(osThread(mbNetServer), (void *)newconn);
         }
     }
}


void mbnet_Init()
{
     osThreadDef(mbNetMain, mbnetMain, osPriorityNormal, 0, 512);
     osThreadCreate(osThread(mbNetMain), NULL);
}

void mbnet_Service()
{
}



Další informace o konferenci Hw-list