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:cc3200 sl_send ()函数被阻止

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1382117/cc3200-cc3200-sl_send-function-is-blocking

器件型号:CC3200

工具与软件:


SDK 版本:v1.5.0

ServicePack:servicepack_1.0.1.15-2.15.0.1.bin


我的数据大小为:36KB/s;

一段时间后、在 sl send()函数中阻止。

void SimpleLinkSockEventHandler(SlSockEvent_t *pSock)

回调不会产生事件;或者它在 sl_send()中被阻止,以便   不调用回调。

我想问一下这个问题可能出在哪里以及如何解决。

谢谢

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

    您好!

    否、通过套接字发送的 API 发送套接字后、不执行套接字回调。

    套接字 API 可能处于阻塞或非阻塞状态。 发送的套接字超时可以使用 API SL_SOL_SOCKET -> SL_SO_RCVTIMEO 进行设置。 如果您要在非阻塞模式下使用套接字、可以通过 API SL_SOL_SOCKET -> SL_SO_NONBLOCKING 来设置套接字。 更多详细信息、请参阅swru368c

    1月

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

    我想知道为什么它被阻止,即使当前的连接,数据总是可以发送,花很长时间将会退出。 但为什么会继续阻塞呢?

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

    您好!

    默认情况下会阻止套接字 API 调用。 但是,如果您正在发送不适合内部缓冲区的相对较大的数据块(32kB ),并且 WiFi 连接速度较慢,sl_Send() API 可能会阻塞更长的时间。 这是正常的。

    但是、如果您希望更好地控制发送数据的过程、没有任何因素会阻止您将套接字切换到非阻塞模式、并将发送数据划分为较小的块。

    1月

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

    事实上、当这个问题发生时、我每200ms 发送大约1560字节。 当我使用非阻塞通信时、在200ms 内发送1560字节会导致 WIFI 中断

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

    您好!

    当使用非阻塞模式时、您需要监控返回代码。 当返回诸如 SL_EAGAIN 的错误代码时、您需要重复发送尝试。

    1月

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

    我找不到 errno 变量、因此我是从以下代码获取 sl_EAGAIN、还是 sl_send 只是返回 sl_EAGAIN

    void SimpleLinkSockEventHandler(SlSockEvent_t *pSock)
    {
        switch(pSock->Event)
        {
        case SL_SOCKET_TX_FAILED_EVENT:
            switch( pSock->socketAsyncEvent.SockTxFailData.status)
            {
            case SL_ECLOSE:
                logError(TAG,"[SOCK ERROR] - close socket (%d) operation "
                                    "failed to transmit all queued packets\n\n",
                                        pSock->socketAsyncEvent.SockTxFailData.sd);
                break;
            case SL_ENOTCONN:
                break;
            case SL_EAGAIN:
                break;
            default:
                logError(TAG,"[SOCK ERROR] - TX FAILED:socket %d , reason (%d)\r\n",
                            pSock->socketAsyncEvent.SockTxFailData.sd,
                            pSock->socketAsyncEvent.SockTxFailData.status);
                break;
            }
            break;
        case SL_SOCKET_ASYNC_EVENT:
            break;
        default:
            logError(TAG,"sock evt.code:%d\r\n",pSock->Event);
            break;
        }
    }

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

    您好!

    sl_Send() API 返回代码。 读取所有 sl_ API 调用中编码的返回值是绝对必要的。 此外、您还无法在任何异步处理程序内调用 sl_ API。

    正如我之前所说的、套接字事件处理程序与您的案例无关。

    1月

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

    /*!
        \brief write data to TCP socket
        
        This function is used to transmit a message to another socket.
        Returns immediately after sending data to device.
        In case of TCP failure an async event SL_SOCKET_TX_FAILED_EVENT is going to
        be received.
        In case of a RAW socket (transceiver mode), extra 4 bytes should be reserved at the end of the 
        frame data buffer for WLAN FCS 
         
        \param[in] sd               socket handle
        \param[in] buf              Points to a buffer containing 
                                    the message to be sent
        \param[in] Len              message size in bytes. Range: 1-1460 bytes
        \param[in] flags            Specifies the type of message 
                                    transmission. On this version, this parameter is not
                                    supported for TCP.
                                    For transceiver mode, the SL_RAW_RF_TX_PARAMS macro can be used to determine
                                    transmission parameters (channel,rate,tx_power,preamble)
        
        
        \return                     Return the number of bytes transmitted, 
                                    or -1 if an error occurred
        
        \sa     sl_SendTo 
        \note                       belongs to \ref send_api
        \warning   
        \par        Example:
        \code       An example of sending data:
        
                    SlSockAddrIn_t  Addr;
                    _i16 AddrSize = sizeof(SlSockAddrIn_t);
                    _i16 SockID;
                    _i16 Status;
                    _i8 Buf[SEND_BUF_LEN];
    
                    Addr.sin_family = SL_AF_INET;
                    Addr.sin_port = sl_Htons(5001);
                    Addr.sin_addr.s_addr = sl_Htonl(SL_IPV4_VAL(10,1,1,200));
    
                    SockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0);
                    Status = sl_Connect(SockID, (SlSockAddr_t *)&Addr, AddrSize);
                    Status = sl_Send(SockID, Buf, 1460, 0 );
     
        \endcode
     */ 
    #if _SL_INCLUDE_FUNC(sl_Send )
    _i16 sl_Send(_i16 sd, const void *buf, _i16 Len, _i16 flags);
    #endif

    这是 sl_send 的注释、其中指出如果发生异常、-1应该是固定的、而不是 sl_EAGAIN。

    这描述了从回调函数返回一个与上述错误代码不同的错误代码。 请询问应遵循哪一项

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

    正如 Jan 所说、该事件或状态不会在 SimpleLinkSockEventHandler 中返回、它遵循 sl_send API、并与注释对齐。