Other Parts Discussed in Thread: CC3200MOD, CC3200, CC3200SDK
您好!
我尝试在具有多线程功能的 CC3200MOD Launchpad 上构建 TCP 服务器。 但始终存在接受连接错误。 sl_accept ();返回一个未定义为任何宏的值-100。 您能告诉我这是什么类型的错误吗? 我如何解决它?
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.
您好!
错误-100为 sl_api_aborted、在 device.h 中定义 在 E2E 中的其他线程上可以找到有关 sl_API_ABLEBLETED 的更多信息、包括:
https://e2e.ti.com/support/wireless-connectivity/wifi/f/968/t/551340
当 SimpleLink 主机驱动程序检测到导致 Wi-Fi 网络处理器(NWP)无法进一步运行的致命错误时、会返回 SL_API_ABORTED 错误。 一旦 API 中止发生、就需要 MCU 复位来清除错误条件。
中止错误有许多潜在原因。 在 CC3200上、有几个常见原因:
如果您可以按照 此处的说明 捕获 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
您好!
查看日志、您似乎没有在设备上刷写最新的服务接收器。 请在此处下载最新的服务包: 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、
我注意到以下几点:
我复制了您的代码、通用概念工作正常。 我已按照上述说明进行了一些修改,并按预期运行。 我可以连接两个 TCP 客户端、并使用附加的代码在我的安装程序上并行传输数据。 请尝试运行我的代码、看看它是否适用于您的设置。
/cfs-file/__key/communityserver-discussions-components-files/968/cc3200_5F00_tcp_5F00_server.c
此致、
Michael
您好、Shivam、
我已经测试了我的附加代码、当我在我的设置上运行它时、它不会返回 sl_api_aborted 错误。 请查看我随附的 CCS 项目、并在您的设置中生成+运行该代码。 请告诉我您是否遇到了我的项目中的相同 sl_api_aborted 错误。 该工程不仅具有我的代码、而且具有我使用的确切编译设置。 它还有一个二进制和.out 文件、您可以通过设置进行健全性检查。 您需要使用 SSID 为"simplelinktest"且密码为"wiitest"的 AP、二进制文件才能正常工作。
此致、
Michael
您好、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
您好、Shivam、
当我在我的设置上测试程序时、我不会遇到打开套接字、关闭套接字和退出线程的任何问题。
附件是我使用的完整工程 CCS 工程目录、没有任何问题。
请尝试将.bin 刷写到您的 CC3200 Launchpad 上、或使用调试器加载.out、然后查看您是否遇到相同的问题。 您的 AP 所需的 SSID 和密钥与上次相同。
此致、
Michael