工具/软件:TI-RTOS
我正在尝试将 Tiva 设置为通过 UDP 接收单字节数据包。 我已经取得了一些成功:我可以正确接收数据包。 但是、在12个连续的数据包(每包1个字节)之后、我无法再接收数据包。 具体来说、fdSelect 函数会在没有超时的情况下挂起、如果我给它一个、则会超时。 我已经指出它 fdSelect 调用 fdPoll、这就是挂起。 以下是我的代码:
//
//配置 UDP
//
#define UDPPORT 5005/**
设置 UDP 任务。
*当设备连接到网络
时调用此挂钩,*并且连接可用。
*/
void networkOpenHook()
{
Task_handle taskHandle;
Task_Params taskParams;
ERROR_Block EB;
//确保错误块已初始化。
ERROR_INIT (&EB);
//创建 UDP 任务处理程序。
//第一个参数是任务侦听的端口。
//将其设置为高优先级任务。
Task_Params_init (&taskParams);
taskParams.STACKSIZE = 1024;
taskParams.priority = 1;
taskParams.arg0 = UDPPORT;
taskHandle = Task_create ((Task_FuncPtr) udpHandler、&taskParams、&EB);
if (taskHandle ==空)
system_printf ("无法创建 udpHandler 任务。\n");
}
空 udpHandler (UARg arg0、UARg arg1)
{
套接字 lSocket;
struct saddr_in sLocalAddr;
struct sockaddr_in client_addr;
结构时间 val 至;
fd_set readfds;
int addrlen = sizeof (client_addr);
INT 状态;
句柄 hBuffer;
IPN LocalAddress = 0;
int nbytes;
bool 标志= true;
char*缓冲区;
fdOpenSession (TaskSelf());
lSocket = socket (AF_iNet、SOCK_DGRAM、IPPROTO_UDP);
if (lSocket < 0){
System_printf ("udpHandler:套接字失败\n");
Task_exit();
返回;
}
memset ((char *)&sLocalAddr、0、sizeof (sLocalAddr));
sLocalAddr.Sin_Family = AF_iNet;
/sLocalAddr.Sin_len = sizeof (sLocalAddr);
sLocalAddr.Sin_addr.s_addr = LocalAddress;
sLocalAddr.Sin_port = htons (arg0);
status = bind (lSocket、(struct sockadr *)&sLocalAddr、sizeof (sLocalAddr));
如果(状态< 0){
system_printf ("udpHandler:绑定失败:返回:%d,错误:%d\n",状态,fdError());
fdClose (lSocket);
Task_exit();
返回;
}
TO.tv_sec = 5;
TO.tV_usec = 0;
//在我们接收数据时循环
静态 uint32_t TRIGGER_COUNT = 0;
while (flag){
fd_zero (readfds);
fd_set (lSocket、readfds);
if (fdSelect (0、readfds、NULL、NULL、&to)!= 1){
status = fdError();
system_printf ("等待客户机时超时\n"、状态);
system_printf ("udpHandler:迄今为止已收到%u 个触发器\n"、trigger_count);
system_flush();
继续;
}
nbytes = recvncfrom (lSocket、(void **)&buffer、MSG_WAITALL、(struct sockadr *)&client_addr、&addrlen、 hBuffer (&H);
if (nbytes >= 0){
//如果接收到应答字节,则回显该字节。
uint8_t data =*((uint8_t*) buffer);
if (data == 0xAA){
Sendto (lSocket、(char*)&data、1、0、(struct sockadr *)&client_addr、 sizeof (client_addr));
recvncfree (hBuffer);
System_printf ("udpHandler:将%u 回显到客户端。\n"、数据);
} 否则{
TRIGGER_COUNT++;
System_printf ("udpHandler:从客户端接收到%u。\n"、数据);
}
}
否则{
status = fdError();
if (status == EWOULDBLOCK){
System_printf ("udpHandler:等待客户端发送 UDP 数据。\n");
继续;
}
否则{
System_printf (
"udpHandler:Recvfrom Failed:returned:%d、error:%d\n"、
字节、状态);
fdClose (lSocket);
flag = false;
}
}
system_printf ("udpHandler:接收到%u 个触发器\n"、trigger_count);
System_printf ("udpHandler stop、lSocket = 0x%x\n"、lSocket);
system_flush();
if (lSocket){
fdClose (lSocket);
}
fdCloseSession(TaskSele());
/*
*由于 deleteTerminatedTasks 是在 cfg 文件中设置的,
*当空闲任务运行时,任务将被删除。
*
Task_exit();
}
/*
=== main ====
*/
int main (void)
{
/*呼叫板初始化函数*/
Board_initGeneral();
Board_initEMAC();
Board_initGPIO();
/*打开用户 LED */
GPIO_WRITE (Board_LED0、Board_LED_ON);
//初始化 CONFIG_t 以使用全局螺线管
GLOBAL_CONFIG.MOTLEA = GLOBAL_MODERATLEA;
GLOBAL_CONFIG.num_MOTORS = NUM_MOTORS;
system_printf ("启动示例\n 系统提供程序设置为 SysMin。 "
"停止目标以查看 ROV 中的任何 SysMin 内容。\n");
/* SysMin 仅在您调用 flush 或 exit 时才会打印到控制台*/
system_flush();
/*启动 BIOS */
BIOS_start();
返回(0);
}
我不知道它是否重要、但除了 UDP 代码之外、我还在运行 HTTP 服务器(成功)。