野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15413|回复: 1

W5500网络通信TCP Server自动断开连接

[复制链接]
发表于 2021-5-31 20:37:02 | 显示全部楼层 |阅读模式
通信类型: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;
                }
        }
}


2.png
1.png
3.png
6.png
5.png
4.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-26 11:54 , Processed in 0.036229 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表