主题中讨论的其他器件:CC3100
我正在将 cc3100配置为接入点。 移动电话充当客户端、即 STA、它将连接到接入点、即 CC3100并通过 FTP 执行文件下载。
我可以在大多数时间正确下载文件、但有时我会在移动客户端观察超时。 客户端套接字将超时。 (每10次迭代可重现一次超时)。
原因可能是什么? 我们在 cc3100上需要注意的是什么。 即 sl_send 的用法。 我将使用 sl_Send 以1K 大小的数据包连续传输文件数据。
在以下示例中、我们将数据包转储到 sl_Send 上并检查错误。 但不知道客户是否收到了它。
是否有方法检查移动客户端是否正确接收到传输的数据。 即 sl_Send 将等待客户端 STA 移动设备读取数据。
代码:
#define MAX_NUM_OF_TX_Bytes 1024
uint8_t * pui8FileBuff =文件缓冲数据[40960];
SlSockAddrIn_t tActiveRemoteAddr;
uint32_t ui32BufferOffset = 0;
uint16_t ui16BytesToBeTransfered = 0;
//从命令获取数据端口的 IP 地址和端口号
sscanf ((const char *) ms_ui8RxBuffer、"端口%d、%d、%d、%d、%d、%d "、iActIp[0]、&iActIp[1]、&iActIp[2]、&iActIp[3]、 (Int*)&iActPort[0],(int*)&iActPort[1]);
iPortDec = iActPort[0]*256 + iActPort[1];
#ifdef _emulator
printf ("IP 为%d.%d.%d.%d\n"、iActIp[0]、iActIp[1]、iActIp[2]、iActIp[3]);
printf ("port %d\n"、iPortDece);
#endif
//打开新套接字进行数据传输
MS_i16DataAct = sl_Socket (sl_AF_iNet、sl_sock_stream、0);
if (ms_i16SDataAct < 0)
{
#ifdef _emulator
printf ("[TCP 数据套接字]创建套接字错误\n\r");
#endif
返回 EN_ERR_SOCKET;
}//end of if (ms_i16SDataAct < 0)
tActiveRemoteAddr.Sin_Family = SL_AF_iNet; //IPv4套接字
tActiveRemoteAddr.Sin_port = sl_Htons ((_U16) iPortDec); //客户端数据端口号
tActiveRemoteAddr.Sin_addr.s_addr = sl_Htonl (sl_IPv4_VAL (iActIp[0]、iActIp[1]、iActIp[2]、iActIp[3]);//客户端数据端口 IP 地址
if (sl_Connect (ms_i16DataAct、(SlSockAddr_t *)&tActiveRemoteAddr、(_U16) sizeof (SlSockAddr_t)< 0)
{
if (ms_i16SDataAct >= 0)
{
sl_close (ms_i16DataAct);//失败时关闭数据端口的套接字
MS_i16DataAct =-1;
}
}
//循环以1K 大小的数据包传输文件数据。
while (ui32BufferOffset < ui32NumofBytesRead)
{
ui16BytesToBeTransfered = MAX_NUM_OF_TX_BYIES;
//检查要传输的剩余字节
if (ui16BytesToBeTransfered >(ui32NumofBytesRead - ui32BufferOffset))
{
ui16BytesToBeTransfered = ui32NumofBytesRead - ui32BufferOffset;
}
i32NumOfBytesSent = sl_Send (ms_i16DataAct、(pui8FileBuff + ui32BufferOffset)、ui16BytesToBeTransfered、0);
if (i32NumOfBytesSent < 0)
返回 ERR_SL_SEND;
//增加缓冲区偏移
ui32BufferOffset += ui16BytesToBeTransfered;
//需要为繁忙循环添加 NonOsMainloop
_slNonOsMainLoopTask();
}//endof while
谢谢、此致、
Durga Prasad。