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:接受错误代码-100

Guru**** 2771175 points

Other Parts Discussed in Thread: CC3200MOD, CC3200, CC3200SDK

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/819402/cc3200-accept-error-code--100

器件型号:CC3200

您好!

我尝试在具有多线程功能的 CC3200MOD Launchpad 上构建 TCP 服务器。 但始终存在接受连接错误。 sl_accept ();返回一个未定义为任何宏的值-100。 您能告诉我这是什么类型的错误吗? 我如何解决它?

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

    您好!

    错误-100为 sl_api_aborted、在 device.h 中定义  在 E2E 中的其他线程上可以找到有关 sl_API_ABLEBLETED 的更多信息、包括:

    https://e2e.ti.com/support/wireless-connectivity/wifi/f/968/t/551340

    https://e2e.ti.com/support/wireless-connectivity/wifi/f/968/t/695900?CC3200-sl-RecvFrom-returns-error-code-100

    当 SimpleLink 主机驱动程序检测到导致 Wi-Fi 网络处理器(NWP)无法进一步运行的致命错误时、会返回 SL_API_ABORTED 错误。 一旦 API 中止发生、就需要 MCU 复位来清除错误条件。

    中止错误有许多潜在原因。 在 CC3200上、有几个常见原因:

    1. 主机驱动程序或其上下文已损坏。 您应该检查并确保没有栈溢出、正确分配了您的指针、并且没有任何可能破坏主机驱动程序的内容。
    2. 主机驱动程序尝试执行非法操作。 根据您执行多线程的方式,您的任务可能正在执行冲突的 SL API 调用,或者更改影响 sl_Accept()调用的 NWP 状态。 此外、您应该确保您使用的是支持多线程版本的 SL 库: https://e2e.ti.com/support/wireless-connectivity/wifi/f/968/t/516812
    3. 主机驱动程序 API 在中断上下文中执行。 您不能在 API 上下文中调用 SL API、这将触发系统中的意外行为。

    如果您可以按照 此处的说明 捕获 NWP 日志并将其提供给我进行分析、这会很有帮助。 这样、我就可以看到导致中止的事件序列。

    此致、

    Michael

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

    您好!

    我有项目的日志文件。  此外 、这里还提供了一些代码片段。

    void ServerRoutine (void * NewSock)
    {
    char bubuff [1024];
    内部 iStatus;
    Int *;New*(((int * Sock);
    报告("我在常规函数中");
    
    再次:iStatus = sl_Recv (、buff、1024、0);
    if (iStatus=SL_EAGAIN)
    再去一次;
    
    否则 if (iStatus <=0)
    {
    //错误
    sl_close (New4);
    报告("建议出错:%d\n\r"、iStatus);
    //assert_ON_ERROR (RECV_ERROR);
    }
    其他
    { buff [iStatus]='\0';
    报告("接收到的数据:%s\n"buff);
    报告("接收到的数据包成功\n\r\n);
    //从连接的 TCP 客户端接收后关闭连接的套接字
    iStatus = sl_close (New;New;ITN)
    if (iStatus!=0)
    报告("关闭连接%d\n\r"、iStatus 时出错);
    //assert_ON_ERROR (iStatus);
    New= 1;
    }
    OSI_TaskDelete (NULL);
    }
    
    
    //************
    //
    //! \brief 打开 TCP 服务器端套接字并接收数据
    //!
    //! 此函数在监听模式下打开 TCP 套接字并等待传入
    //! TCP 连接。
    //! 如果建立了套接字连接、则函数将尝试读取
    //! 来自连接的客户端的1000个 TCP 数据包。
    //!
    //! 服务器将侦听的\param[in]端口号
    //!
    //! 返回 成功时为0、错误时为-1。
    //!
    //! \note 此函数将等待传入连接、直至
    //! 其中一个是建立
    的///***********
    
    void BsdTcpServer(vid *para)
    {
    SlSockAddrIn_t sAddr;
    SlSockAddrIn_t sLocalAddr;
    
    内部 iAddrSize;
    内部 iSockID;
    内部 iStatus;
    带符号短整型 iNewSockID=-1;
    SlSockNonBlocking_t enableOption;
    enableOption.NonblockingEnabled = 1;
    unsigned short usPort=5023;
    long lRetVal =-1;
    int master_socket=1;
    
    //填充 TCP 服务器套接字地址
    sLocalAddr.Sin_Family = SL_AF_iNet;
    sLocalAddr.Sin_port = sl_Htons (无符号短整型) usPort);
    sLocalAddr.Sin_addr.s_addr = 0;
    
    //创建 TCP 套接字
    master_socket = sl_Socket (sl_AF_iNet、sl_sock_stream、0);
    if (master_socket < 0)
    {
    //错误
    //assert_ON_ERROR (socket_create_error);
    }
    
    iAddrSize = sizeof (SlSockAddrIn_t);
    
    //将 TCP 套接字绑定到 TCP 服务器地址
    iStatus = sl_Bind (master_socket、(SlSockAddr_t *)&sLocalAddr、iAddrSize);
    if (iStatus < 0)
    {
    //错误
    sl_close (master_socket);
    //assert_ON_ERROR (bind_error);
    }
    
    //放置用于侦听传入 TCP 连接的套接字
    iStatus = sl_listen (master_socket、0);
    if (iStatus < 0)
    {
    sl_close (master_socket);
    //assert_ON_ERROR (listen_error);
    }
    
    //设置套接字选项使套接字成为非阻塞
    iStatus = sl_SetSockOpt (master_socket、sl_SOL_socket、sl_SO_NONBLOCKING、(_u8 *)&enableOption、sizeof (enableOption));
    if (iStatus < 0)
    {
    sl_close (master_socket);
    //assert_ON_ERROR (socket_opt_error);
    }
    报告("启动服务器");
    
    //等待传入的 TCP 连接
    while (1){
    //接受来自 TCP 客户端的连接(如果有)
    //否则返回 SL_EAGAAIN
    while (iNewSockID<0){
    iNewSockID = sl_accept (master_socket、(struct SlSockAddr_t *)&sAddr、(SlSocklen_t*)&iAddrSize); //<--这里是接受函数
    if (iNewSockID == sl_EAGAAIN)
    {
    map_UtilsDelay (1000);
    }
    否则、如果(iNewSockID < 0 && iNewSockID!= sl_EAGAAIN)
    {
    //错误
    报告("接受错误");
    sl_close (iNewSockID);
    sl_close (master_socket);
    //assert_ON_ERROR (ACCEP_ERROR);
    }
    
    }
    
    报告("新客户端:%d\n\r\n"iNewSockID);
    
    //为每个接受连接创建任务
    lRetVal= OSI_TaskCreate (ServerRoutine,(const signed char*)"TCP 服务器例程",OSI_STACK_SIZE,&iNewSockID,1,NULL);
    if (lRetVal < 0)
    {
    报告(“为客户端创建任务时出错:%d”、iNewSockID);
    }
    iNewSockID=-1;
    }
    
    
    
    //关闭侦听套接字
    iStatus = sl_close (master_socket);
    //assert_ON_ERROR (iStatus);
    
    
    
    } 

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

    您好!

    您的代码是否基于 SDK 中的 tcp_socket 示例? 您是否只将上述函数复制到您自己的项目中、或者是否直接修改了 tcp_socket 示例项目?  

    sl_accept ()是否总是导致-100中止,即使是与服务器的第一次连接也会导致中止? 还是在任何客户端连接之前返回-100?

    此外、您能否重新上传 NWP 日志? 它似乎无法访问。

    此致、

    Michael

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

    您好!

    我正在使用 SDK 中的 WLAN Station 示例(因为它已配置 FreeRTOS)并尝试使用套接字在端口5001上运行服务器。

    sl_accept ()始终会导致-100中止并且无法与任何客户端连接。

    我无法附加日志文件、因为此处出现了一些问题。
    为了进行确认、日志文件不应可读?

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

    您好!

    日志文件将采用二进制格式。 但是,日志文件中应该有一些可读的纯文本。 例如、复位后、引导加载程序将打开并从外部闪存读取一些文件、例如 servicepack.ucf 文件。 假设您在重置时开始记录日志、您应该能够在 NWP 日志中看到其中的一些文件名。  

    此致、
    Michael

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

    您好!

    我有了日志文件、请告诉我这个问题。 上面给出了代码片段、日志文件如下:

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

    您好!

    查看日志、您似乎没有在设备上刷写最新的服务接收器。 请在此处下载最新的服务包: https://www.ti.com/tool/download/CC3200SDK

    然后、按照"服务包编程"下的步骤来刷写服务包。  http://processors.wiki.ti.com/index.php/CC3100_%26_CC3200_UniFlash_Quick_Start_Guide

    刷写最新的服务包后、请再次尝试运行程序。

    此致、

    Michael

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

    您好!

    我已经上传  了 https://www.ti.com/tool/download/CC3200SDK 中提供的服务包 

    ServicePack 版本: 1.0.1.131-2.11.0.1

    CC3200SDK 版本: 1.3.0

    但它不起作用。

    我有 CC3200MOD LAUNCHXL 板。

    您还可以查看上面的代码、可能我缺少一些东西。

    Shivam

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

    您好、Shivam、

    我注意到以下几点:

    1. 您的任务优先级是什么? 如果 sl_Accept()之后产生的 TCP 套接字任务优先级较低,则传递的套接字 ID 将设置为-1,然后在生成的线程中复制该值。 这将导致 NWP 中出现错误、因为您将尝试从无效的套接字 ID 读取。
    2. 您可能不希望在套接字处理程序函数中使用 map_UtilsDelay (),因为这将阻止调度程序将该线程标记为已阻止并允许抢占线程运行。 相反,您应该使用 OSI_SLEEP()。

    我复制了您的代码、通用概念工作正常。 我已按照上述说明进行了一些修改,并按预期运行。 我可以连接两个 TCP 客户端、并使用附加的代码在我的安装程序上并行传输数据。 请尝试运行我的代码、看看它是否适用于您的设置。

    /cfs-file/__key/communityserver-discussions-components-files/968/cc3200_5F00_tcp_5F00_server.c

    此致、

    Michael

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

    您好、Michael、

    在应用您指定的代码中的更改之后(主要是添加之前未出现的 assert_ON_ERROR 语句)。 我发现甚至没有创建套接字。 函数 sl_Socket ()正在返回 sl_api_aborted (-100)。 但是、我仍然不知道如何消除它。

    Shivam。

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

    您好、Shivam、

    我已经测试了我的附加代码、当我在我的设置上运行它时、它不会返回 sl_api_aborted 错误。 请查看我随附的 CCS 项目、并在您的设置中生成+运行该代码。 请告诉我您是否遇到了我的项目中的相同 sl_api_aborted 错误。 该工程不仅具有我的代码、而且具有我使用的确切编译设置。 它还有一个二进制和.out 文件、您可以通过设置进行健全性检查。 您需要使用 SSID 为"simplelinktest"且密码为"wiitest"的 AP、二进制文件才能正常工作。  

    /cfs-file/__key/communityserver-discussions-components-files/968/tcpserver_5F00_cc3200_5F00_threaded.7z

    此致、

    Michael

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

    您好、Michael、

    我有你的项目。 我无法更改代码中的 SSID 和密码? 此外、我在 main.c 中看不到任何用于该用途的代码、它在哪里?

    谢谢你  

    Shivam

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

    您好、Michael、

    我上传了您提供的代码。 设备已成功连接至 SSID="simplelinktest",并且我能够将第一个 TCP 客户端与其连接。 但第二个客户端无法连接(等待第一个客户端退出)。 我有终端窗口、请看一下。

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

    您好、Shivam、

      在 ServerRoutine()中使用 OSI_TaskDelete()时出现错误。 通过确保 serverThread 删除其自身的线程句柄(而不是 NULL)来解决该问题后、一切都按预期工作、我可以连接多个 TCP 客户端而不会出现任何问题。

    请在您的项目中复制并替换这些附加文件:

    /cfs-file/__key/communityserver-discussions-components-files/968/httpserverapp.h

    /cfs-file/__key/communityserver-discussions-components-files/968/tcpserver.c

    此致、

    Michael

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

    您好、Michael、

    我添加了文件和代码并上传了它。 但仍然存在一些问题。 程序每次都卡在 sl_Socket ()上。 由于套接字未创建、我无法为多个客户端进一步测试它。 这个问题以前也发生过(正如我告诉过的)、但我不知道原因。 时间太长了、但我无法解决这个问题。

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

    您好、Shivam、

    当我在我的设置上测试程序时、我不会遇到打开套接字、关闭套接字和退出线程的任何问题。

    附件是我使用的完整工程 CCS 工程目录、没有任何问题。  

    /cfs-file/__key/communityserver-discussions-components-files/968/2514.tcpserver_5F00_cc3200_5F00_threaded.7z

    请尝试将.bin 刷写到您的 CC3200 Launchpad 上、或使用调试器加载.out、然后查看您是否遇到相同的问题。 您的 AP 所需的 SSID 和密钥与上次相同。

    此致、

    Michael

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

    您好、Michael、

    这次它很成功! 是的、最终成功了。 我加载了.bin 文件并使用3个客户端(PC、两部电话)对其进行了测试。 我可以同时连接所有设备并发送数据。

    非常感谢您的帮助。  

    我的明显问题-您是如何做到的? 请分享代码、并告诉我您在代码中做了哪些重大更改。

    谢谢

    Shivam   

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

    您好、Shivam、

    我不记得任何一个使一切正常工作的具体重大变化。 必须进行各种修复和调整。 我建议您使用文件夹比较工具将我的项目文件与您拥有的文件进行比较。

    无论如何、感谢您让我知道我的代码适用于您的设置。

    此致、
    Michael

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

    您好、Michael、

    我试图了解您的代码、这就是我将项目导入到 CCS v6 (我之前使用的是 IAR)的原因。 但是、在构建项目时、我会看到一些错误、例如:

    查看错误后,我检查了“Include paths which were this:

    然后,我将所有路径更改为:

    $C:/TI/CC3200SDK_1.3.0/cc3200-sdk/simplelink  (如下所示)。

    但是、我仍然会得到相同的误差。

    可以帮帮我吗?

    Shivam

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

    您好、Shivam、

    我将 CCS 9.1用于我的 CC3200 SDK 项目、包括我在上一篇文章中提供的项目。 在获取为 CCS 9生成的工程并尝试在 CCS 6中编译工程时、肯定会出现兼容性问题。 我建议您安装 CCS 9、看看您是否可以将我的项目导入 CCS9工作区、看看这是否可以解决您的问题。

    此致、

    Michael