Other Parts Discussed in Thread: CC3135
我使用以下代码评估 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。 当我尝试关闭套接字时、我只会遇到此错误、如果我 要持续发送数据、它就可以正常工作。
