请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TM4C1294NCPDT 工具/软件:TI-RTOS
您好!
我正在尝试将以太网通信添加到我的现有项目中。 我在 TI-RTOS 中使用 TCP IP 堆栈。 当我的 MCU 配置为服务器并且我的远程设备是客户端通信时、通信工作正常。 我以3kHz 的速率流式传输大约24个字节。 我正在尝试将 MCU 用作客户端来实现相反的情况。 但是、在几秒钟的传输停止后、我能够建立连接。 我使用了 Wireshark 来查看传输通信。 我始终使 TCP Window Full (TCP 窗口已满)、TCP 重新传输几次、最后以 TCP 零通信结束。 TCP 客户端(MCU)停止传输,即使 send()命令位于 tcpHandler()任务中,while (1) loop 和信标或 ctr1变量(取决于我释放 loop()的方式)正由中断设置。 我使用了登录信息来检查它。
我在下面附上我的代码片段。 我当前正在从计时器中断触发 tcp_task (我尝试使用信标和虚拟控制变量来触发任务循环)。
空 tcpHandler (UARg arg0、UARg arg1)// TCP 任务
{
套接字 lSocket;
struct saddr_in sLocalAddr;
fdOpenSession (TaskSelf());
lSocket = socket (AF_iNet、SOCK_STREAM、IPPROTO_TCP);
if (lSocket < 0){
System_printf ("tcpHandler:套接字失败\n");
Task_exit();
返回;
}
memset ((char *)&sLocalAddr、0、sizeof (sLocalAddr));
sLocalAddr.Sin_Family = AF_iNet;
sLocalAddr.sin addr.s_addr = inet_addr ("18.62.20.135");//htonl (INADDR_ANY);
sLocalAddr.Sin_port = htons (5000);
System_printf ("已连接!");
TimerDisable (TIMER2_base、timer_A); //启用计时器2
system_flush();
while (connect (lSocket、(struct sockaddr *)和 sLocalAddr、sizeof (sLocalAddr))< 0){
SysCtlDelay (g_ui32SysClock/200);
}
int nbytes = 3*8;
TimerEnable (TIMER2_base、TIMER_A); //启用计时器2
while (true){
if (ctr1==1){
// RES=Semaphore_pend (tcp_semaphore、BIOS_wait_forever);
LOG_Info1 ("TOGGLED2 [%u]次"、切换计数); //将切换计数发送到 UIA
char temp[24]=data_to_transmit;
SEND (lSocket、(char *)&temp、nbytes、0);
ctr1=0;
}
}
void ISRTimer(void){
TimerIntClear (TIMER2_base、TIMER_TINA_TIMEOUT); //必须清除计时器的计时器标志
log_info1 ("切换[%u]次"、切换计数); //将切换计数发送到 UIA
切换计数+= 1; //跟踪#togsnoges
// semaphore_post (tcp_semaphore);
ctr1=1;
}
我还尝试将静态 IP 分配给 PC 和 Tiva、并直接与交换机连接。 结果相同。
提前感谢。
CCS7.3
TI-RTOS 2.16.1.14
XDC 3.32.0.06
