2017-07-03 9 views
1

私はSTM32F107で3つまたは4つのtcpサーバを実行しようとしました。私はfreeRTOSとLwIP(そしてCubeMX + ST HALライブラリ)を使っています。STM32 LwiP複数のTCPサーバ

私はタスクtcp_serverを作成し、そのタスクの中で、それぞれ異なるTCPポートを持つ3つのnetconn構造を作成します。 コールバック:

void socket_callback(struct netconn * conn, enum netconn_evt evt, u16_t len) 
{ 
    queue_event_t msg; 
    if (evt == NETCONN_EVT_RCVPLUS) 
    { 
      msg.cmd = MSG_TEST; 
      if (conn == user_conn.conn_modbus) 
       msg.cmd = MSG_MODBUS; 
      else if (conn == user_conn.conn_modbus_listen) 
       msg.cmd = MSG_MODBUS_LISTEN; 
      else if (conn == user_conn.conn_rs232) 
       msg.cmd = MSG_RS232; 
      else if (conn == user_conn.conn_rs232_listen) 
       msg.cmd = MSG_RS232_LISTEN; 
      else if (conn == user_conn.conn_rs485) 
       msg.cmd = MSG_RS485; 
      else if (conn == user_conn.conn_rs485_listen) 
       msg.cmd = MSG_RS485_LISTEN; 
      xQueueSend(user_conn.evtQueue, &msg, 1000); 
    } 
} 

サーバーの作成:

static struct netconn * createServer(int port) 
{ 
    struct netconn * conn; 
    err_t err; 

    conn = netconn_new_with_callback(NETCONN_TCP, socket_callback); 
    if (conn == NULL) 
    { 
      char *msg = "Cannot create netconn\n\r"; 
      HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), 0xFFFF); 
      return NULL; 
    } 

    err = netconn_bind(conn, NULL, port); 
    if (err != ERR_OK) 
    { 
     char *msg = "Error in Binding \n\r"; 
     HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), 0xFFFF); 
     print_error(err); 
     netconn_delete(conn); 
     return NULL; 
    } 
    err = netconn_listen(conn); 
    if (err != ERR_OK) 
    { 
     char *msg = "Error in listenning \n\r"; 
     HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), 0xFFFF); 
     print_error(err); 
     netconn_delete(conn); 
     return NULL; 
    } 
    return conn; 
} 

スレッド:

static void servertcp_thread() 
{ 
    queue_event_t evt; 
    user_conn.evtQueue = xQueueCreate(10, sizeof (queue_event_t)); 
    user_conn.conn_modbus_listen = createServer(502); 
    user_conn.conn_rs232_listen = createServer(10001); 
    user_conn.conn_rs485_listen = createServer(50001); 

    while(1) 
    { 
     waitServer(&user_conn, &evt); 
     send_rs232(&user_conn); 
     send_rs485(&user_conn); 
     if((user_conn.conn_modbus_listen != NULL) && (evt.cmd == MSG_MODBUS_LISTEN)) 
      processModbusListen(&user_conn); 
     if((user_conn.conn_rs232_listen != NULL) && (evt.cmd == MSG_RS232_LISTEN)) 
      processRS232Listen(&user_conn); 
     if((user_conn.conn_rs485_listen != NULL) && (evt.cmd == MSG_RS485_LISTEN)) 
      processRS485Listen(&user_conn); 
     if((user_conn.conn_modbus != NULL) && (evt.cmd == MSG_MODBUS)) 
      modbus_tcp_server(&user_conn); 
     if((user_conn.conn_rs232 != NULL) && (evt.cmd == MSG_RS232)) 
      rs232_tcp_server(&user_conn); 
     if((user_conn.conn_rs485 != NULL) && (evt.cmd == MSG_RS485)) 
      rs485_tcp_server(&user_conn); 
    } 
} 

作成に成功(netconn_new_with_callback/netconn_bindとエラーなしでnetconn_listen)です。

私は1つのTCPポートに接続しようとしましたが、それは受け入れられ、すべてが問題ありません。

しかし、最初の接続がまだ生きている間に2番目のポートに接続しようとすると、コールバックが呼び出されますが、netconn_accept(conn、& newconn);失敗し、ERR_ABRTを報告し、理由を知らない。

static int processXXXListen(user_conn_t * user_data) 
{ 
    struct netconn *newconn; 
    err_t error_accept; 
    error_accept = netconn_accept(user_data->conn_XXX_listen, &newconn); 
    if (error_accept == ERR_OK) 
    { 
     if (user_data->conn_rs485) 
     { 
      // Close unwanted connection 
      netconn_close(newconn); 
      netconn_delete(newconn); 
      char *msg = "Error XXX Connection during establishement\n\r"; 
      HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), 0xFFFF); 
     } 
     else 
     { 
      // connection established 
      char *msg = "XXX Connection established\n\r"; 
      HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), 0xFFFF); 
      user_data->conn_XXX = newconn; 
     } 
    } 
    else 
    { 
     char *msg = "Error in acceptation TCP XXX connection\n\r"; 
     HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), 0xFFFF); 
     print_error(error_accept); 
    } 
    return 0; 
} 

奇妙なことは、私は唯一の2 netconn構造を作成するときに、私は2接続に問題がないことを、次のとおりです。

3機能(processModbusListen、processRS232ListenとprocessRS485Listenは)同じプロトタイプ以下のコード化されています同じ時に。

何が原因で接続が切断される可能性がありますか? 3つの接続を同時に取得するにはどうすればよいですか? それはもちろん可能であるならば...

+1

問題が見つかりました... #define MEMP_NUM_NETCONN 10デフォルトでは4に設定されていましたが、このパラメータは高度なパラメータ... – Bobnono

+0

答えが正しいと確信できる場合は、あなたのコメントを回答として投稿してください。 –

答えて

0

[OK]を、はいテストの1DAY後、 のparam

#define MEMP_NUM_NETCONN 4 

は私がtroublするものdefinetlyです。 私はそれを10に設定しなければならず、すべてが魅力のように機能します

関連する問題