主题中讨论的其他器件:CC3235MODSF、
大家好、
我正在使用以下组件作为 TCP 客户端开发应用程序:
具有 CC3235MODSF 的定制硬件
SIMPLELINK-CC32XX-SDK 版本:5.10.00.02
Service Pack 版本:4.1.0.28
目的是能够尽快从套接字接收数据。 来自 TCP 服务器的数据大小不是恒定的。 套接字上的通信是全双工的。 因此、来自 TCP 服务器的数据可能会随时接收、TCP 客户端也可以随时发送数据。
由于这些要求、我假设我必须使用一个线程来非常频繁地轮询套接字或阻止套接字、直到接收到1个字节。 如果我根据需要频繁地轮询套接字、则 MCU 延迟处理其他优先级较低的线程内的其他操作。 如果我阻止套接字、只有在收到一个字节后、我才会设置套接字非阻塞并接收其余的数据字节。 但是、这也不够快、我从调试时序中可以看到。
以下是我通过这两种不同方式调用的函数:
/* Create a client socket. */
sl_Socket(SL_AF_INET, SL_SOCK_STREAM, 0);
/* Try to connect to server. */
sl_Connect(sd, (SlSockAddr_t *)&addr, sizeof(SlSockAddr_t));
/* Set socket as non-blocking. */
nonBlocking = TRUE;
rs = sl_SetSockOpt(sd, SL_SOL_SOCKET, SL_SO_NONBLOCKING, &nonBlocking, sizeof(nonBlocking));
/* Begin receiving loop. */
while(1)
{
/* Try receiving first byte several times. */
for(i = 0 ; i < 100 ; i++)
{
/* Check socket to receive first byte. */
rs = sl_Recv(sd, gp_buff, 1, SL_MSG_DONTWAIT);
/* Check if there is no data. */
if(SL_ERROR_BSD_EAGAIN == rs)
{
/* Sleep to try again later. */
usleep(1000);
}
else
{
/* Break the for loop. */
break;
}
}
/* Check if first byte received. */
if(1 == rs)
{
/* Receive rest of data. */
rs = sl_Recv(sd, &gp_buff[1], 4095, SL_MSG_DONTWAIT);
/* Process data.... */
}
/* Check if there is no data. */
else if(SL_ERROR_BSD_EAGAIN == rs)
{
/* Sleep task to try again later. */
usleep(100000);
}
/* Check if there is an error. */
else
{
/* Break the loop. */
break;
}
}
/* Create a client socket. */
sl_Socket(SL_AF_INET, SL_SOCK_STREAM, 0);
/* Try to connect to server. */
sl_Connect(sd, (SlSockAddr_t *)&addr, sizeof(SlSockAddr_t));
/* Set socket as non-blocking. */
nonBlocking = TRUE;
rs = sl_SetSockOpt(sd, SL_SOL_SOCKET, SL_SO_NONBLOCKING, &nonBlocking, sizeof(nonBlocking));
/* Begin receiving loop. */
while(1)
{
/* Block socket to receive first byte. */
rs = sl_Recv(sd, gp_buff, 1, SL_MSG_DONTWAIT);
/* Check if first byte received. */
if(1 == rs)
{
/* Receive rest of data. */
rs = sl_Recv(sd, &gp_buff[1], 4095, SL_MSG_DONTWAIT);
/* Process data.... */
}
/* Check if there is an error. */
else
{
/* Break the loop. */
break;
}
}
另一方面、如果我尝试虚拟方案、我确切知道 TCP 服务器将发送多少字节、我可以看到通信发生得非常快。
我也尝试过在触发模式下使用 SL_Select、但由于我正在使用 TI-RTOS、我在论坛中读到不建议这样做。
请告诉我是否有更好的方法来处理此 TCP 通信。
最棒的
欧格尔肯