微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI WIFI设计交流 > CC3100 数据接收的问题!sl_RecvFrom 卡死

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

时间:10-02 整理:3721RD 点击:

我再使用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中挂起的,请问怎么解决!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top