微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI WIFI设计交流 > TCP的connect 一直阻塞,要在udp发送数据以后,才能connect成功?求解

TCP的connect 一直阻塞,要在udp发送数据以后,才能connect成功?求解

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

   用cc3000和stm32f10系列的mcu搭配,移植spi驱动的初期存在了一些问题,后来都是通过把杜邦线减短来解决了问题,现在杜邦线连接cc3000和stm32,线长9cm左右,可以连接到固定AP名称的路由器上,存在以下的问题:

     1,UDP发送时,第一个数据包网络调试助手接收不到,后面的都能接收到。部分代码如下:

    选择建立的socket类型

case UART_COMMAND_SOCKET_OPEN:
   linktype=atoshort(usBuffer[2], usBuffer[3]);
   if(linktype==1)
  ulSocket = socket(2,2,17);//AF_Init SOCK_DGRAM  UDP 
   else if(linktype==2)
ulSocket = socket(2,1,6);//AF_Init SOCK_STREAM TCP
   else
  ulSocket = socket(2,2,17);
udp发送数据:

		case UART_COMMAND_SEND_DATA:pcData = (char *)&usBuffer[4];ulDataLength = atoshort(usBuffer[2], usBuffer[3]);pcSockAddrAscii = (pcData + ulDataLength);
		  tSocketAddr.sa_family =2;
      // the destination port tSocketAddr.sa_data[0] = ascii_to_char(pcSockAddrAscii[0], pcSockAddrAscii[1]);tSocketAddr.sa_data[1] = ascii_to_char(pcSockAddrAscii[2], pcSockAddrAscii[3]);// the destination porttSocketAddr.sa_data[2] = ascii_to_char(pcSockAddrAscii[4], pcSockAddrAscii[5]);tSocketAddr.sa_data[3] = ascii_to_char(pcSockAddrAscii[6], pcSockAddrAscii[7]);tSocketAddr.sa_data[4] = ascii_to_char(pcSockAddrAscii[8], pcSockAddrAscii[9]);tSocketAddr.sa_data[5] = ascii_to_char(pcSockAddrAscii[10], pcSockAddrAscii[11]);sendto(ulSocket, pcData, ulDataLength, 0, &tSocketAddr, sizeof(sockaddr));
    	break;

出现的问题是:第一个发送出去的数据包网络调试助手都收不到,通过串口手动发送指令0405123451f90c0a80165

   TCP发送数据时,要先发送一次UDP数据,CC3000才能建立和目标IP和端口的TCP server建立连接,然后数据能够发送成功。如果不先建立UDP连接的话,TCP的connect一直是blocking,直到timeout。
  TCP发送数据的代码:

case UART_COMMAND_SEND_DATA_TCP:pcData = (char *)&usBuffer[4];ulDataLength = atoshort(usBuffer[2], usBuffer[3]);pcSockAddrAscii = (pcData + ulDataLength);
		  // the family is always AF_INET//tSocketAddr.sa_family = atoshort(pcSockAddrAscii[0], pcSockAddrAscii[1]);
		  tSocketAddr.sa_family =2;
      // the destination port tSocketAddr.sa_data[0] = ascii_to_char(pcSockAddrAscii[0], pcSockAddrAscii[1]);tSocketAddr.sa_data[1] = ascii_to_char(pcSockAddrAscii[2], pcSockAddrAscii[3]);// the destination porttSocketAddr.sa_data[2] = ascii_to_char(pcSockAddrAscii[4], pcSockAddrAscii[5]);tSocketAddr.sa_data[3] = ascii_to_char(pcSockAddrAscii[6], pcSockAddrAscii[7]);tSocketAddr.sa_data[4] = ascii_to_char(pcSockAddrAscii[8], pcSockAddrAscii[9]);tSocketAddr.sa_data[5] = ascii_to_char(pcSockAddrAscii[10], pcSockAddrAscii[11]);

  	  ulSocket = socket(2,1,6);
		  //TCP connect blocking returen 0 is success
		 if(connect(ulSocket,&tSocketAddr,sizeof(sockaddr))==0)
		  send(ulSocket,pcData,ulDataLength,0);
		 else
		 { printf("Connect tcp service failed!\n\r"); closesocket(ulSocket); ulSocket = socket(2,1,6);
	     connect(ulSocket,&tSocketAddr,sizeof(sockaddr));
       send(ulSocket,pcData,ulDataLength,0);}

个人觉得不是杜邦线的问题了,因为CC3000已经能够初始化,且连接上AP了。



你电脑的防火墙有没有挡包?

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

网站地图

Top