Запуск TCP-сервера и UDP-клиента на STM32 - PullRequest
1 голос
/ 29 марта 2019

Я пытаюсь запустить TCP-сервер и UDP-клиент одновременно на STM32 Nucleo F746ZG.Я использую библиотеки freeRTOS и LWIP, и у меня возникают проблемы при запуске обеих сетевых технологий (TCP и UDP) одновременно.Однако независимо они работают нормально.Невозможно запустить оба одновременно или что-то не так с моим кодом?

Вот как я реализовал TCP-сервер:

static void tcp_thread(void *arg)
{
struct_out *qstruct;
err_t err, recv_err;
struct netconn *conn;
struct netbuf *inbuf;
struct netconn *newconn;
struct_sock *arg_sock;
arg_sock = (struct_sock*) arg;
conn = arg_sock->conn;
u16_t buflen;
char* buf;
char* str2;
int ret;

for(;;)
{
err = netconn_accept(conn, &newconn);
if (err == ERR_OK)
{
  for(;;)
  {
    recv_err = netconn_recv(newconn, &inbuf); //Receive data
    if (recv_err == ERR_OK)
    {
      netbuf_data(inbuf, (void**)&buf, &buflen); //Get the data
      if((buf[0]==0x0D)||(buf[0]==0x0A))//Compruebo si es un salto de 
linea
      {
        netbuf_delete(inbuf); //Limpia el buffer de entrada de datos
        continue;
      }
      //qstruct = osMailAlloc(strout_Queue, osWaitForever);
      //qstruct->y_pos = arg_sock->y_pos;

      strncpy(str_buf,buf,buflen);
      str_buf[buflen]=0;
      //sprintf(qstruct->str,"%-20s", str_buf);
      osMailPut(strout_Queue, qstruct);
      osMailFree(strout_Queue, qstruct);

      //Salto de linea para a la hora de imprimir dejar espacio y que no 
se peguen los mensajes
      str_buf[buflen] = '\r';
      str_buf[buflen+1] = '\n';
      strcpy(str2, "hi");

      ret = strncmp(str_buf, str2, 4);

         if(ret == 0) {
             netconn_write(newconn, str_buf, buflen+2, NETCONN_COPY); 
//Escribe y si lo quito no hay ACK de llegada del paquete
             netbuf_delete(inbuf); //Limpia el buffer de entrada de datos
         } else {
             netconn_write(newconn, "recived", 4, NETCONN_COPY); 
//Escribe y 
si lo quito no hay ACK de llegada del paquete
             netbuf_delete(inbuf); //Limpia el buffer de entrada de datos
         }

    }
    else
    {
      netbuf_delete(inbuf);
      netconn_close(newconn);
      break;

    }
  }
}
else
{
  osDelay(1);
}
}
void StartDefaultTask(void const * argument)
{
/* init code for LWIP */
  MX_LWIP_Init();

  /* USER CODE BEGIN 5 */
  struct netconn *conn;
  err_t err;
  //sock01.y_pos = 60;
  //sock02.y_pos = 180;
  conn = netconn_new(NETCONN_TCP);
  if(conn!=NULL)
  {
    sock01.conn = conn;
    sock02.conn = conn;
    err = netconn_bind(conn, NULL, 80);
    if (err == ERR_OK)
    {
      netconn_listen(conn);
      sys_thread_new("tcp_thread1", tcp_thread, (void*)&sock01, 
DEFAULT_THREAD_STACKSIZE, osPriorityNormal );
      sys_thread_new("tcp_thread2", tcp_thread, (void*)&sock02, 
DEFAULT_THREAD_STACKSIZE, osPriorityNormal );
    }
    else
    {
      netconn_delete(conn);
    }
  }
  /* Infinite loop */
  for(;;)
  {
    osDelay(1);
  }
/* USER CODE END 5 */ 
} 

Это UDP-клиент:

    void udp_client_connect(void)
    {
    ip_addr_t DestIPaddr;
    err_t err;
    upcb = udp_new();
    if (upcb!=NULL)
    {
    IP4_ADDR(&DestIPaddr, 192, 168, 1, 150);
    upcb->local_port = 1555;
    err= udp_connect(upcb, &DestIPaddr, 52709);
    if (err == ERR_OK)
    {
    udp_recv(upcb, udp_receive_callback, NULL);
    }
    }
    }

Спасибо, товарищи !!

1 Ответ

1 голос
/ 09 апреля 2019

Я решил проблему, не используя библиотеку FreeRTOS, потому что, если вы хотите реализовать ее, вы можете выполнить только одну задачу одновременно. Я рекомендую вам ознакомиться с учебными пособиями по ST Microelectronics на вашей плате. В вашем случае вы можете найти его по следующей ссылке:

https://www.st.com/content/st_com/en/products/embedded-software/mcu-mpu-embedded-software/stm32-embedded-software/stm32cube-mcu-mpu-packages/stm32cubef7.html

Здесь вы найдете несколько примеров UDP и TCP (сервер и клиент) только с использованием библиотеки LWIP, что проще.

Надеюсь, это решит вашу проблему;)

...