This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC3200-LAUNCHXL:TCP IP 套接字问题

Guru**** 1641220 points
Other Parts Discussed in Thread: CC3200
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1212630/cc3200-launchxl-tcp-ip-socket-issue

器件型号:CC3200-LAUNCHXL
主题中讨论的其他器件:CC3200

我的要求是建立 WiFi 到 UART 桥接器。 我使用了 TCP IP 套接字 SDK 代码、并在两个不同的任务中使用 FreeRTOS 对其进行了修改、如下所示:

//主代码中添加的部分代码

OSI_TaskCreate (UART_TO_WiFi、"WiFi_Tx"、\
OSI_STACK_SIZE、NULL、3、NULL);

/*为从 WiFi 到 UART 的数据创建任务*/
OSI_TaskCreate (WiFi_to_uart、"WiFi_Rx"、\
OSI_STACK_SIZE、NULL、2、NULL);

/*启动调度程序*/
OSI_START();

//uart_to_WiFi 代码  

静态 void uart_to_WiFi (void *pvParameters)

  /*局部变量*/
  字符 TX_buffer [1024];
  INT 索引= 0;
  字符;

while (1)

   /*清除数据*/
   memset (TX_BUFFER、'\0'、sizeof (TX_BUFFER));

   /*从 UART 读取数据*/
   for (;;)
   {
     chr = UartGetChar();
     如果(CHR ='\n')
     {
       tx_buffer[index]= chr;
       索引= 0;
       中断;
      }
      方案
       {
        tx_buffer[index]= chr;
        索引++;
       }
    }

     如果(strlen (TX_BUFFER)> 0)
     {
      /*通过 WiFi 发送数据*/
      int err = sl_Send (sock、TX_buffer、strlen (TX_buffer)、0);

      if (err < 0)
      {
        uart_print ("发送数据时出错\n\r\n);
       }
    }

 /*任务延迟*/
 OSI_SLEEP (12);
  }
}

//WiFi_to_uart 代码

静态空 WiFi_to_uart (void * pvParameters)

  /*局部变量*/
  字符 rx_buffer [1024];
  INT 索引= 0;

  while (1)
  {
     /*清除数据*/
     memset (rx_Buffer、'\0'、sizeof (rx_Buffer));

     /*通过 WIFI 接收数据*/
     int err = sl_Recv (sock、Rx_buffer、sizeof (Rx_buffer)、0);

    if (err > 0)
    {
      /*将数据写入 UART */
      while (index < strlen (rx_buffer))
       {
         UartPutChar (rx_buffer[index]);
         索引++;
       }
       索引= 0;
    }

   /*任务延迟*/
   OSI_SLEEP (15);
  }
}

问题是数据通过 WiFi 传输,但第一次 recv()函数不工作。 因此、数据不匹配、即2个 Tx 数据是1Rx 数据、第3个 Tx 数据是2个 Rx 数据、以此类推。

此外、套接字功能如下所示:

void socket_connect()

  /*套接字变量*/
  Int iStatus;
  SlSockAddrIn_t sAddr;
   int iAddrSize;

   /*将值分配给变量*/
  sAddr.sin_family = SL_AF_INET;
  sAddr.sin_port = sl_Htons ((unsigned short) g_uiPortNum);
  sAddr.sin_addr.s_addr = sl_Htonl ((unsigned int) g_ulDestinationIp);
  iAddrSize = sizeof (SlSockAddrIn_t);

  while (1)
   {
     /*套接字创建*/
     SOCk = SL_Socket (SL_AF_INET、SL_SOCK_STREAM、0);
     if (sock < 0)
     {
        uart_print ("套接字未创建\r\n ");
      }
      方案
      {
       uart_print ("套接已创建\r\n ");
      }

      /*套接字连接*/
       iStatus = sl_Connect (sock、(SlSockAddr_t *)&sAddr、iAddrSize);
       if (iStatus < 0)
       {
         uart_print ("套接字已断开连接... \r\n");
       }
       方案
       {
        uart_print ("套接字已成功连接\r\n ");

        /*成功创建插槽时显示绿色 LED */
        GPIO_IF_LedOn (MCU_GREEN_LED_GPIO);

        中断;
        }
     }
}

上面,我已经尝试了非阻塞的方法,客户端连接到 WiFi 和套接字,但在发送功能期间,我收到错误代码为-1

能否说明问题出在哪里?

谢谢。

德瓦哈帕

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Devaharsha、

    我看到这是一个重复的标签。 请使用第一张机票、我们将返回给您。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我单击为 已解决 包含在前一个 TT 中。 这是原始票据。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    有人可以帮助解决上述问题吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您所尝试实现的目标似乎已经作为示例实现。 您是否看过 CC3200 SDK 中的 serial_wifi 示例? 运行该示例后、您可以将代码与该示例进行比较、看看可能缺少了什么。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!  

    我看到过您建议的示例、即"serial_WIFI"。 我不明白为什么在循环中每次都要创建和连接套接字?  

    此外、我认为上述问题是因为非阻塞套接字。 因此、根据 serial_wifi 示例、我在套接字连接后添加了非阻塞套接字选项。 但代码仍在执行相同的方式,即问题是数据通过 WiFi 传输,但 Recv()函数第一次不工作。 因此、数据不匹配、即如果数据被回送、则第2个 Tx 数据是第1个 Rx 数据、第3个 Tx 数据是第2个 Rx 数据。

    您能帮我找出问题所在吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    有人可以帮助解决上述问题吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果将断点放置在 recv()函数中,则这两个任务都能正常运行。 如果在没有任何断点的情况下执行相同的代码、则会出现相同的上述问题。  您能帮忙吗?