我使用以下代码评估 STM32L4控制器上的 CC3135。
自动结果= sl_Start (nulptr、nulptr、nullptr); INT CTR = 0; while (true){ printf ("%d\r\n"、CTR++); const auto sockid = sl_Socket (sl_AF_iNet、sl_sock_stream、0); constexpr SlTimever_t timeVal{20、0}; Auto sockOptSetResult = sl_SetSockOpt (sockid、sl_SOL_socket、sl_SO_RCVTIMEO、&timeVal、sizeof (timeVal)); if (sockOptSetResult!= 0){ printf ("设置超时失败\r\n); sl_close (sockid); sl_Stop (0xFFFF); sl_Start (nulptr、nulptr、nullptr); ThisThread:SLEEP_for (1000); 继续; } constexpr SlSockNonblocking_t enableOption{1}; sockOptSetResult = sl_SetSockOpt (sockid、sl_SOL_socket、sl_SO_NONBLOCKING、(_u8 *)&enableOption、sizeof (enableOption)); if (sockOptSetResult!= 0){ printf ("未能设置非阻塞\r\n); ThisThread:SLEEP_for (1000); NVIC_SystemReset(); } SlSockAddrIn_t addr; Addr.Sin_Family = SL_AF_iNet; Addr.Sin_port = sl_Htons (8888); addr.sin addr.s_addr = sl_Htonl (sl_IPv4_VAL (192、168、42、130)); 结果= SLNETERR_BSD_EALREADY; constexpr auto POLL_interval = 10; constexpr auto MAX_POLL = 1000; 对于(int i = 0;i < MAX_POLL && RESULT = SLNETERR_BSD_EALREADY;i++){ 结果= sl_Connect (sockid、reinterpret_cast (addr)、sizeof (SlSockAddrIn_t)); thisThread::yield (); 如果(结果< 0){ 该主题::SLEEP_for (POLL_INTERVAL); } } 如果(结果< 0){ printf ("连接%d\n"失败、结果); sl_close (sockid); 继续; } constexpr auto buffer_size = 1460; 静态 char buffer[buffer_size]; std:::transform (std:开始(buffer)、std:结束(buffer)、std:开始(buffer)、 [](char)-> char{return static_cast (标准:rand();}); 对于(int i = 0;i < 1000;i++){ 结果= SLNETERR_BSD_EAGAIN; 对于(int k = 0;k < MAX_POLL && RESULT = SLNETERR_BSD_EAGAIN;k++){ 结果= sl_Send (sockid、buffer、sizeof (buffer)、0); thisThread::yield (); if (result!= sizeof (buffer)){ 该主题::SLEEP_for (POLL_INTERVAL); } } 如果(结果< 0){ printf ("发送%d\n"失败、结果); NVIC_SystemReset(); } } 结果= sl_close (sockid); if (结果!= 0){ printf ("关闭失败%d\r\n"、结果); } printf ("done \r\n"); }
它通常运行几次迭代、然后抛出"致命错误:未检测到 Cmd Ack [cmd 操作码= 0x9401]"并停止工作。 sl_SetSockOpt ()将在下一个迭代中失败、该迭代将通过调用 sl_Stop 和 sl_Start 来重新启动模块。 根据文档、这应该可以解决该问题、但不能解决。 在下一个迭代中、它将连接到 AP 并通过 DHCP 获取 IP、但再次失败、并出现相同的错误。 在大多数情况下、sl_close 确实返回0、但在极少数情况下、它返回-2005。 当我尝试关闭套接字时、我只会遇到此错误、如果我 要持续发送数据、它就可以正常工作。