CC3200 UDP 非阻塞模式下,使用sl_RecvFrom函数接收数据,每调用sl_RecvFrom函数40多次的时候,就会出现大概16ms的延时时间,请问下如何去掉这个延时时间?测试程序:修改udp_socket 例程。
int BsdUdpServer(unsigned short usPort)
{
SlSockAddrIn_t sAddr;
SlSockAddrIn_t sLocalAddr;
int iCounter;
int iAddrSize;
int iSockID;
int iStatus;
long lLoopCount = 0;
short sTestBufLen;
{
SlSockAddrIn_t sAddr;
SlSockAddrIn_t sLocalAddr;
int iCounter;
int iAddrSize;
int iSockID;
int iStatus;
long lLoopCount = 0;
short sTestBufLen;
// filling the buffer
for (iCounter=0 ; iCounter<BUF_SIZE ; iCounter++)
{
g_cBsdBuf[iCounter] = (char)(iCounter % 10);
}
for (iCounter=0 ; iCounter<BUF_SIZE ; iCounter++)
{
g_cBsdBuf[iCounter] = (char)(iCounter % 10);
}
sTestBufLen = BUF_SIZE;
//filling the UDP server socket address
sLocalAddr.sin_family = SL_AF_INET;
sLocalAddr.sin_port = sl_Htons((unsigned short)usPort);
sLocalAddr.sin_addr.s_addr = 0;
//filling the UDP server socket address
sLocalAddr.sin_family = SL_AF_INET;
sLocalAddr.sin_port = sl_Htons((unsigned short)usPort);
sLocalAddr.sin_addr.s_addr = 0;
iAddrSize = sizeof(SlSockAddrIn_t);
// creating a UDP socket
iSockID = sl_Socket(SL_AF_INET,SL_SOCK_DGRAM, 0);
if( iSockID < 0 )
{
// error
ASSERT_ON_ERROR(SOCKET_CREATE_ERROR);
}
iSockID = sl_Socket(SL_AF_INET,SL_SOCK_DGRAM, 0);
if( iSockID < 0 )
{
// error
ASSERT_ON_ERROR(SOCKET_CREATE_ERROR);
}
// binding the UDP socket to the UDP server address
iStatus = sl_Bind(iSockID, (SlSockAddr_t *)&sLocalAddr, iAddrSize);
if( iStatus < 0 )
{
// error
sl_Close(iSockID);
ASSERT_ON_ERROR(BIND_ERROR);
}
iStatus = sl_Bind(iSockID, (SlSockAddr_t *)&sLocalAddr, iAddrSize);
if( iStatus < 0 )
{
// error
sl_Close(iSockID);
ASSERT_ON_ERROR(BIND_ERROR);
}
//*************************************************************************************
udp_socket_opt_set(iSockID); //设置非阻塞模式
while (1)
{
iStatus = sl_RecvFrom(iSockID, g_cBsdBuf, sTestBufLen, 0,( SlSockAddr_t *)&sAddr, (SlSocklen_t*)&iAddrSize ); if(iStatus>0)
{
lLoopCount++;
UART_PRINT("\r\n lLoopCount = %d",lLoopCount); }
//IO取输出 使用逻辑分析仪查看IO输出情况 5430.IO输出情况.docx
GPIO_OUT(GPIOA1_BASE, 0x2,0); GPIO_OUT(GPIOA1_BASE, 0x2,1);
}
udp_socket_opt_set(iSockID); //设置非阻塞模式
while (1)
{
iStatus = sl_RecvFrom(iSockID, g_cBsdBuf, sTestBufLen, 0,( SlSockAddr_t *)&sAddr, (SlSocklen_t*)&iAddrSize ); if(iStatus>0)
{
lLoopCount++;
UART_PRINT("\r\n lLoopCount = %d",lLoopCount); }
//IO取输出 使用逻辑分析仪查看IO输出情况 5430.IO输出情况.docx
GPIO_OUT(GPIOA1_BASE, 0x2,0); GPIO_OUT(GPIOA1_BASE, 0x2,1);
}
//*************************************************************************************
UART_PRINT("Recieved %u packets successfully\n\r",g_ulPacketCount);
//closing the socket after receiving 1000 packets
sl_Close(iSockID);
sl_Close(iSockID);
return SUCCESS;
}
}
void udp_socket_opt_set(int16_t iSockID)
{
SlSockNonblocking_t enableOption;
enableOption.NonblockingEnabled = 1;
sl_SetSockOpt(iSockID,SL_SOL_SOCKET,SL_SO_NONBLOCKING, (uint8_t *)&enableOption,sizeof(enableOption)); // 使能/禁止非阻塞模式,默认阻塞模式
}
{
SlSockNonblocking_t enableOption;
enableOption.NonblockingEnabled = 1;
sl_SetSockOpt(iSockID,SL_SOL_SOCKET,SL_SO_NONBLOCKING, (uint8_t *)&enableOption,sizeof(enableOption)); // 使能/禁止非阻塞模式,默认阻塞模式
}
void GPIO_OUT(unsigned long GPIO_BASE,unsigned char PIN,unsigned char value)
{ switch(value)
{
//case 0: GPIOPinWrite(GPIO_BASE,PIN,0); break;
//case 1: GPIOPinWrite(GPIO_BASE,PIN,PIN); break;
case 0: HWREG(GPIO_BASE + (GPIO_O_GPIO_DATA + (PIN << 2))) = 0;break;
case 1: HWREG(GPIO_BASE + (GPIO_O_GPIO_DATA + (PIN << 2))) = PIN;break; }
}
{ switch(value)
{
//case 0: GPIOPinWrite(GPIO_BASE,PIN,0); break;
//case 1: GPIOPinWrite(GPIO_BASE,PIN,PIN); break;
case 0: HWREG(GPIO_BASE + (GPIO_O_GPIO_DATA + (PIN << 2))) = 0;break;
case 1: HWREG(GPIO_BASE + (GPIO_O_GPIO_DATA + (PIN << 2))) = PIN;break; }
}
Alvin Chen:
你每次发送的data 一样吗?
user5065865:
回复 Alvin Chen:
CC3200 没发送数据到PC,CC3200只是一直查询接收数据。
Alvin Chen:
回复 user5065865:
"CC3200 UDP 非阻塞模式下,使用sl_RecvFrom函数接收数据" 你没有数据给CC3200对吧,那应该没有差异的。
user5065865:
回复 Alvin Chen:
对的,可是我测试结果,并不是这样的,您查一下逻辑分析仪的波形就知道 了,我已经上传输了的,您可以自己测试一下,板子是官方的CC3200板子
user5065865:
回复 Alvin Chen:
通过串口打印的结果,CC3200 并没有接收到数据,所以可以排除,是接收数据影响到IO输出的情况,再者通过IO的输出波形看出在不正常的时候IO都是保持为高电平,所以确定是接收函数占用了时间。
经过测试UDP是能正常接收数据的。
Alvin Chen:
回复 user5065865:
我找了一个同事帮你测试请在下面的链接跟进;
e2e.ti.com/…/785049
user5065865:
回复 Alvin Chen:
好的,谢谢您
Alvin Chen:
回复 user5065865:
请在那个帖子上面提供更多的细节。
user5065865:
回复 Alvin Chen:
ok
TI中文支持网


