TI中文支持网
TI专业的中文技术问题搜集分享网站

CC3200 sl_Select 使用不成功问题

TI工程师,你们好:

UDP客户端发送数据和接收数据中我使用了sl_Select去等待可发送和可接收事件,代码如下,但是出现的现象是写的sl_Select要等足8秒(我设置就为8秒)才返回,而读的sl_Select就一直都不返回,请问是我使用上存在问题还是其他什么原因呢?谢谢

  SlTimeval_tsel_to;SlSockAddrIn_tipas_addr;SlFdSet_trfds, wfds;SlSockNonblocking_t enable_option;inti_addr_size, socket_fd = -1, ret;ipas_addr.sin_family= SL_AF_INET;ipas_addr.sin_port= sl_Htons(PORT);ipas_addr.sin_addr.s_addr = sl_Htonl(IP);i_addr_size = sizeof(SlSockAddrIn_t);socket_fd = sl_Socket(SL_AF_INET, SL_SOCK_DGRAM, 0);if(socket_fd < 0){DO_Printf("sl_Socket call Failure!\r\n");goto function_exit;}enable_option.NonblockingEnabled = 0x1;sl_SetSockOpt(socket_fd, SOL_SOCKET, SL_SO_NONBLOCKING, &enable_option, sizeof(enable_option));keep_on_send:sel_to.tv_sec  = 8;sel_to.tv_usec = 0;SL_FD_ZERO(&wfds);SL_FD_SET(socket_fd, &wfds);ret = sl_Select(socket_fd + 1, 0, &wfds, 0, &sel_to);if(ret < 0){DO_Printf("sl_Select1 call failure!\r\n");goto function_exit;}else{if(SL_FD_ISSET(socket_fd, &wfds)){ret = sl_SendTo(socket_fd, sp + already_len, willbe_len - already_len, 0, (SlSockAddr_t *)&ipas_addr, i_addr_size);if(ret < 0){DO_Printf("sl_SendTo call Failure!\r\n");goto function_exit;}else{already_len += ret;DO_Printf("Send Data Count:%d\r\n", already_len);if(already_len < willbe_len){goto keep_on_send;}}}else{DO_Printf("Send Data Timeout!\r\n");goto function_exit;}}DO_Printf("Test Send Finish\r\n");keep_on_recv:SL_FD_ZERO(&rfds);SL_FD_SET(socket_fd, &rfds);sel_to.tv_sec  = 8;sel_to.tv_usec = 0;ret = sl_Select(socket_fd + 1, &rfds, 0, 0, &sel_to);if(ret < 0){DO_Printf("sl_Select2 call failure!\r\n");goto function_exit;}else{if(SL_FD_ISSET(socket_fd, &rfds)){ret = sl_RecvFrom(socket_fd, sp + already_len, willbe_len - already_len, 0, (SlSockAddr_t *)(&ipas_addr), (SlSocklen_t*)(&i_addr_size));if(ret < 0){if(ret == SL_EAGAIN){goto keep_on_recv;}DO_Printf("sll_SendTo call Failure!\r\n");goto function_exit;}else{already_len += ret;if(already_len < willbe_len){goto keep_on_recv;}}}else{DO_Printf("Recv Data Timeout!\r\n");goto function_exit;}}.....

 
Yonghua Pan:

1. 你的读和写都是在一台cc31xx上吗,如果是的话能否合到一个select里面去查询

2. 你读写的fds的时候8秒之后它的返回值是多少呢?

chen mark:

回复 Yonghua Pan:

8秒之后是能读到数据的,也就是fds是有被置位的,现象就是有数据时Select不能马上返回,一定要超时才能,超时返回的fds是正确的

chen mark:

回复 Yonghua Pan:

不过这个问题我用其他办法解决了,后来想了下,其实没必要使用select。。。

请您帮我看看另外一个问题吧!就是如何获取CC3200 STA模式下的连接质量.

http://www.deyisupport.com/question_answer/wireless_connectivity/wifi/f/105/t/71209.aspx

chen mark:

回复 Yonghua Pan:

哦,我的解决办法就是不使用select,因为是设置为异步socket,后来想了一下,使用select就是多此一举,直接法判断send和recv的返回值就好了,使用free-rtos的时间API去做超时判断。

赞(0)
未经允许不得转载:TI中文支持网 » CC3200 sl_Select 使用不成功问题
分享到: 更多 (0)