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.

CC3100 数据接收的问题!sl_RecvFrom 卡死

Other Parts Discussed in Thread: CC3100, CC3200

我再使用CC3100做wifi通信的时候,在调用的sl_RecvFrom的时候,一直要等到有数据过来才能执行这个函数,相当于没有收到数据的话程序就在这里卡死了!好像是关于阻塞和非阻塞的问题吧!

      怎么样采用其他方式接收吗?比如采用中断方式接收,或者是不是可以再SimpleLinkSockEventHandler函数里面完成接收???

     或者说,最不好的情况可以不用在sl_RecvFrom接收的情况卡死,采用查询的方式接收,能否给出响应的例子,

      非常感谢!!!

  • 找到非阻塞方式的使用办法了,在API里有介绍!

    SlSockNonblocking_t enableOption;
    enableOption.NonblockingEnabled = 1;
    sl_SetSockOpt(SockID,SL_SOL_SOCKET,SL_SO_NONBLOCKING, (_u8 *)&enableOption,sizeof(enableOption)); // Enable/disable nonblocking mode

            但是按照API的方法试了之后,我再不停的查询发送的过程中,程序没有跑多长时间就死掉了!而且动不动就死掉,应该是socket死掉,程序一直在执行
    _SlNonOsMainLoopTask(void)函数
  • 发现程序死在_SlNonOsSemGet函数里:

    _SlNonOsRetVal_t _SlNonOsSemGet(_SlNonOsSemObj_t* pSyncObj, _SlNonOsSemObj_t WaitValue, _SlNonOsSemObj_t SetValue, _SlNonOsTime_t Timeout)
    {
        while (Timeout>0)
        {
            if (WaitValue == *pSyncObj)
            {
                *pSyncObj = SetValue;
                break;
            }
            if (Timeout != NONOS_WAIT_FOREVER)
            {		
                Timeout--;
            }
            _SlNonOsMainLoopTask();
    #ifdef _SlSyncWaitLoopCallback
            if( __NON_OS_SYNC_OBJ_SIGNAL_VALUE == WaitValue )
            {
                if (WaitValue == *pSyncObj)
                {
                    *pSyncObj = SetValue;
                    break;
                }
                _SlSyncWaitLoopCallback();
            }
    #endif
        }
    
        if (0 == Timeout)
        {
            return NONOS_RET_ERR;
        }
        else
        {
            return NONOS_RET_OK;
        }
    }

    最后由于Timeout始终大于0导致程序卡死在这里!这个问题怎么解决???非常感谢!!!

  • 你好,

    我也碰到sl_recv不往下执行的问题,我用了超时的方法退出,例程里面有类似这样的代码:

    struct SlTimeval_t timeval;
    timeval.tv_sec = 0; // Seconds
    timeval.tv_usec = 20000; // Microseconds. 10000 microseconds resolution

    rawSocket = sl_Socket(SL_AF_RF, SL_SOCK_RAW, eChannel); 

    // set timeout - in case we have no activity for the specified channel
    sl_SetSockOpt(rawSocket,SL_SOL_SOCKET,SL_SO_RCVTIMEO, &timeval, sizeof(timeval)); // Enable receive timeout
    status = sl_Recv(rawSocket, DataFrame, sizeof(DataFrame), 0);

    设置超时时间就可以退出。

    然后,跟你碰到的情况一样,运行一阵子就在_SlNonOsSemGet()的while里面出不来,请问你的问题解决了吗?能跟我分享一下吗?

  • 碰到相同的问题,在 transceiver 模式下,多次更换信道(几十次)再做 sl_Recv 卡死。

    开发板使用的是 CC3200 LaunchPad,更新到最新的 ServicePack 后该问题仍然没得到解决。

  • 目前来说更换信道之前,请先关掉socket, 然后再创建,这样就不会挂死。

  • 我也碰到这样问题, 请问你的问题解决了吗 ?

  • 请参考我上面说的,在更换channel之前,先关掉socket, 然后再基于下一个channel来open socket.

  • 这问题不知道解决了没有,感觉TI的东西很难用好啊,到处都是assert,动不动就是个while(1),这产品到底能不能用啊!不能用就直接告诉我们要自己改,省得误导别人!改不好也可以换方案,省得浪费大家时间啊!

  • 我是今年才开始用的,发现可以设置非阻塞运行
  • 您好,我想请教个问题,为什么总是需要更新servicepack_1.0.1.6-2.6.0.5,因为经常导致ConfigureSimpleLinkToDefaultState卡死,我用的TI原装板子,format时选择的1MB,选512K也是一样,debug几次又需要更新了。 麻烦回复一下,谢谢,因为总是这样调试非常麻烦。
  • 什么情况下更换channel? 我们只是调用了sl_RecvFrom接收UDP数据,和它有关系吗。我的也是设置的UDP接收无阻塞,运行一段时间任务会被挂起,查了良久没有想到是在sl_RecvFrom中挂起的,请问怎么解决!