小学生
最后登录1970-1-1
在线时间 小时
注册时间2021-5-31
|
通信类型:TCP Server(W5500-SPI网络通信)
微控制器:STM32F103ZET6
编程库:HAL
问题描述:
在下图(第一张图和第二张图)子循环(增量式PID控制子程序)中,运行快要结束时,偶尔会出现自动关闭socket(getSn_SR(SOCK_TCPS)) == 0x00),且出现后,无法在下一个子循环中连接,只能到下下个子循环连接。通过串口打印(第三张图)可以看到在跳出循环后socket就自动关闭了,且出现CH: 0 Unexpected1 length 0 SEND_OK Problem!!;网络通信(第四张图)也停止收发消息了,只有等到下下个子循环,才会自行恢复。W5500接收程序如第五张图所示,W5500发送程序如第六张图示。
W5500发送程序:
void Robot_Send_Message(uint8 * buf, uint16 len)
{
send(SOCK_TCPS, buf, len); /*向Client发送数据*/
HAL_Delay(10);
if(getSn_IR(SOCK_TCPS) & Sn_IR_SEND_OK)
{
setSn_IR(SOCK_TCPS, Sn_IR_SEND_OK); /*清除接收中断标志位*/
}
}
W5500接收程序:
void Robot_Receive_Command(void)
{
atkkey = 0;
switch(getSn_SR(SOCK_TCPS)) /* 获取socket的状态 */
{
case SOCK_CLOSED: /* socket处于关闭状态 */
{
socket(SOCK_TCPS ,Sn_MR_TCP,local_port,Sn_MR_ND); /* 打开socket */
break;
}
case SOCK_INIT: /* socket已初始化状态 */
{
listen(SOCK_TCPS); /* socket建立监听 */
break;
}
case SOCK_ESTABLISHED: /* socket处于连接建立状态 */
{
if(getSn_IR(SOCK_TCPS) & Sn_IR_CON)
{
setSn_IR(SOCK_TCPS, Sn_IR_CON); /* 清除接收中断标志位 */
}
atkkey=getSn_RX_RSR(SOCK_TCPS); /* 定义len为已接收数据的长度 */
if(atkkey > 0)
{
recv(SOCK_TCPS,atkRxbuf,atkkey); /* 接收来自Client的数据 */
atkRxbuf[atkkey]=0x00; /*添加字符串结束符*/
Robot_Command_Analysis();
}
if(getSn_IR(SOCK_TCPS) & Sn_IR_SEND_OK)
{
setSn_IR(SOCK_TCPS, Sn_IR_SEND_OK); /*清除接收中断标志位*/
}
break;
}
case SOCK_CLOSE_WAIT: /* socket处于等待关闭状态 */
{
disconnect(SOCK_TCPS); /* 断开当前TCP连接 */
close(SOCK_TCPS);
break;
}
}
}
|
|