我再使用CC3100做wifi通信的时候,在调用的sl_RecvFrom的时候,一直要等到有数据过来才能执行这个函数,相当于没有收到数据的话程序就在这里卡死了!好像是关于阻塞和非阻塞的问题吧!
怎么样采用其他方式接收吗?比如采用中断方式接收,或者是不是可以再SimpleLinkSockEventHandler函数里面完成接收???
或者说,最不好的情况可以不用在sl_RecvFrom接收的情况卡死,采用查询的方式接收,能否给出响应的例子,
非常感谢!!!
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.
找到非阻塞方式的使用办法了,在API里有介绍!
发现程序死在_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里面出不来,请问你的问题解决了吗?能跟我分享一下吗?
请参考我上面说的,在更换channel之前,先关掉socket, 然后再基于下一个channel来open socket.
这问题不知道解决了没有,感觉TI的东西很难用好啊,到处都是assert,动不动就是个while(1),这产品到底能不能用啊!不能用就直接告诉我们要自己改,省得误导别人!改不好也可以换方案,省得浪费大家时间啊!
什么情况下更换channel? 我们只是调用了sl_RecvFrom接收UDP数据,和它有关系吗。我的也是设置的UDP接收无阻塞,运行一段时间任务会被挂起,查了良久没有想到是在sl_RecvFrom中挂起的,请问怎么解决!