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.

CC3200 TCP client 接收问题

Other Parts Discussed in Thread: CC3200

TI工程师:

      我使用了两块CC3200进行TCP数据传输实验,其中一块作为服务器,另一块作为客户端,使用的是无阻塞的方式。为什么客户端调用sl_Recv( )函数接收数据时会有较长时间的延时,但服务器端就不会出现这种情况?并且为什么服务器连续给客户端发送几条数据,客户端接收时还会出现数据丢失的情况,同样的,服务器端却不会出现这种问题?

  • 如果是非阻塞应该不会有delay, 你的代码是如何写的?

    NonBlocking = 1;
    iStatus = sl_SetSockOpt(iSockID, SL_SOL_SOCKET,\
    SL_SO_NONBLOCKING, \
    &NonBlocking, sizeof(NonBlocking));

    if( iStatus < 0 )
    {
    // error
    ERR_PRINTS("Socket Setting Err");
    ASSERT_ON_ERROR(sl_Close(iSockID));
    ASSERT_ON_ERROR(TCP_CLIENT_FAILED);

    }

  • 以下是我客户端TCP部分的代码:

    int BsdTcpClient(unsigned short usPort)
    {
        SlSockAddrIn_t  sAddr;
        int             iAddrSize;
        int             iSockID;
        int             iStatus;
    
        //filling the TCP server socket address
        sAddr.sin_family = SL_AF_INET;
        sAddr.sin_port = sl_Htons((unsigned short)usPort);
        sAddr.sin_addr.s_addr = sl_Htonl((unsigned int)g_ulGatewayIP);
    
        iAddrSize = sizeof(SlSockAddrIn_t);
    
        // creating a TCP socket
        iSockID = sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0);
        if( iSockID < 0 )
        {
            ASSERT_ON_ERROR(SOCKET_CREATE_ERROR);
        }
    
        // connecting to TCP server
        iStatus = sl_Connect(iSockID, ( SlSockAddr_t *)&sAddr, iAddrSize);
        if( iStatus < 0 )
        {
            // error
            sl_Close(iSockID);
            ASSERT_ON_ERROR(CONNECT_ERROR);
        }
    
        //setting nonblokcking mode
        long lNonBlocking = 1;
        iStatus = sl_SetSockOpt(iSockID, SL_SOL_SOCKET,
        		SL_SO_NONBLOCKING, &lNonBlocking, sizeof(lNonBlocking));
        if(iStatus < 0)
        {
        	sl_Close(iSockID);
        	UART_PRINT("TCP Client failed\n\r");
        }
    
        //UART wireless transfer
        iStatus = WuartTransfer(UARTA0_BASE, iSockID);
        if(iStatus < 0)
        {
        	UART_PRINT("WUART Transfer failed\n\r");
        }
     
    
        iStatus = sl_Close(iSockID);
        //closing the socket after sending 1000 packets
        ASSERT_ON_ERROR(iStatus);
    
        return SUCCESS;
    }
    int WuartTransfer(unsigned long ulBase, int iSockID) {
    	char cTxBuf[100];
    	char cRxBuf[100];
    	char cGetChar;
    	int  iStatus;
    	int  iCounter = 0;
    
    	while(1)
    	{
    		//UART receive characters
    		cGetChar = MAP_UARTCharGetNonBlocking(ulBase);
    		if(cGetChar != 0xff)
    		{
    			
    			//Save received characters
    			cTxBuf[iCounter++] = cGetChar;
    			//Enter or Esc
    			if((cGetChar == 0x0d) || (cGetChar == 0x1b))
    			{
    				//Send TCP packets
         			        iStatus = sl_Send(iSockID, cTxBuf, iCounter, 0);
    				if(iStatus <= 0)
    				{
    					//errors handle
    					ASSERT_ON_ERROR(sl_Close(iSockID));
    				 	UART_PRINT("Sending data failed\n\r");
    					break;
    				}
    				//enter
    				if(cGetChar == 0x0d)
    				{
    					iCounter = 0;
    				}
    				//Esc, exit the loop
    				else
    					break;
    
    
    			}
    
    		}
    		//Receive TCP packets
    		iStatus = sl_Recv(iSockID, cRxBuf, 100, 0);
    		if(iStatus > 0)
    		{
    			//Enter
    			if(cRxBuf[iStatus-1] == 0x0d)
    			{
    				//save"charaters ending"
    				cRxBuf[iStatus]=0;
    				Message(cRxBuf);
    			}
    			//Enter, exit the loop
    			else
    				break;
    		}
    	}
    	return(iStatus);
    }