我测试了sdk中一个无线收发的例子,发现发射的数据跟接收的不一样,我就让代码在哪单步执行以便找出问题原因,然后发现好像在TCP/IP接收端的server往buffer里写数据时出现了问题,通过调用函数 sl_Recv(iNewSockID, g_cBsdBuf, iTestBufLen, 0);进入下面的程序:
_i16 sl_Recv(_i16 sd, void *pBuf, _i16 Len, _i16 flags)
{
_SlRecvMsg_u Msg;
_SlCmdExt_t CmdExt;
_SlReturnVal_t status;
CmdExt.TxPayloadLen = 0;
CmdExt.RxPayloadLen = Len;
CmdExt.pTxPayload = NULL;
CmdExt.pRxPayload = (_u8 *)pBuf;
Msg.Cmd.sd = (_u8)sd;
Msg.Cmd.StatusOrLen = Len;
/* no size truncation in recv path */
CmdExt.RxPayloadLen = Msg.Cmd.StatusOrLen;
Msg.Cmd.FamilyAndFlags = flags & 0x0F;
status = _SlDrvDataReadOp((_SlSd_t)sd, (_SlCmdCtrl_t *)&_SlRecvCmdCtrl, &Msg, &CmdExt);
if( status != SL_OS_RET_CODE_OK )
{
return status;
}
/* if the Device side sends less than expected it is not the Driver's role */
/* the returned value could be smaller than the requested size */
return (_i16)Msg.Rsp.statusOrLen;
}
我的问题:
1、g_cBsdBuf是接收数组,它将其地址传给了pBuf,pBuf又传给了后面的CmdExt.pRxPayload,本来是通过操作CmdExt.pRxPayload来给g_cBsdBuf数组接收到的数据的,然后就发现CmdExt.pRxPayload = (_u8 *)pBuf;这条代码执行不了,所以也就没法给CmdExt.pRxPayload赋值了,那么g_cBsdBuf也肯定得不到应该接收到的的值。
2、其实不止这一处出现了问题,在程序入口设了一个断点,这时的pBuf还等于g_cBsdBuf数组指针,往前再走一步就又不等于g_cBsdBuf数组指针了,只有等第二次调用函数时它才能等于g_cBsdBuf数组指针,虽然它是一个局部变量,但也不至于变得这么快吧。
3、最后就是进入被调用函数里面之后,单步执行并不管用,一跳好几行,而且有时还是不按顺序的乱跳,很郁闷。
4、应该用多大的数组长度来接收传来的数据(我也不知道发来的一个包有多少有效数据,就先设的iTestBufLen大点儿防止丢数据了),文档说sl_Recv(iNewSockID, g_cBsdBuf, iTestBufLen, 0)的返回值status 等于接收到的长度,如果iTestBufLen设的大了,这个status的值是真实接收的数据包的大小还是要比这个包的长度大的iTestBufLen值(也即数组g_cBsdBuf的长度)。
想了好久也不知道是什么原因,很着急,难道跟编译器的优化选项有关?还请知道原因的大神们告诉一声,真的太感谢了