TCP客户端
W5500的TCP客户端百度到处都有,而且都是一个模子
简而言之:就是这么写,这么用
上菜
/** * @brief TCP客户端 * @param None * @retval None * @warning None * @example **/ void do_tcpc(void) { switch(getSn_SR(SOCK_TCPC)) /*获取socket的状态*/ { case SOCK_CLOSED: /*socket处于关闭状态*/ socket(SOCK_TCPC,Sn_MR_TCP,local_port++,Sn_MR_ND); break; case SOCK_INIT: /*socket处于初始化状态*/ connect(SOCK_TCPC,IP,Port); /*socket连接服务器*/ break; case SOCK_ESTABLISHED: /*socket处于连接建立状态*/ if(getSn_IR(SOCK_TCPC) & Sn_IR_CON){ setSn_IR(SOCK_TCPC, Sn_IR_CON); /*清除接收中断标志位*/ } MainLen=getSn_RX_RSR(SOCK_TCPC); /*获取接收的数据长度*/ if(MainLen>0){//接收到数据 recv(SOCK_TCPC,MainBuffer,MainLen); /*接收来自Server的数据*/ MainBuffer[MainLen]=0x00; /*添加字符串结束符*/ printf(" 接收到消息: "); UsartOutStrIT(USART1,MainBuffer,MainLen); BufferManageWrite(&send_manage_struct3,MainBuffer,MainLen,&MainLen);//把数据写入发送缓存 } break; case SOCK_CLOSE_WAIT: /*socket处于等待关闭状态*/ close(SOCK_TCPC); break; } }
采用的socket1作为了TCP客户端
测试准备工作(需要连接路由器)
保证电脑/手机和W5500在同一个局域网内
1.查看自己电脑的IP地址
2.开启TCP服务器:监听 8080
3.修改程序中连接的IP地址:根据自己的TCP服务器IP地址修改
4.下载测试
单片机串口1 -- 连接CH340 作为日志输出口
单片机串口3 -- 连接485
485连接如下:
测试
1.单片机程序为自动连接TCP服务器,首先保证有客户端连接
2.服务器发消息给客户端
3.485发送消息给TCP服务器
程序说明
1.执行DHCP以后执行TCP客户端程序
2.接收数据以后,使用串口1打印输出
把数据存入缓存
3.读取缓存里面的数据,并使用串口3输出(485)
4.如果串口3(485),缓存里面有数据,则转发给TCP 服务器
细节说明
1.从网口接收的数据,为啥要存入缓存
然后再从缓存里面取出来以后再使用串口3发送出去?
答:你想想如何解决下面的问题
1.1.如果服务器突然过来的几条数据间隔很短,你使用串口3发送的时候你还没发送完就接着来新的数据了!
1.2.如果服务器过来的数据非常多,你处理数据的时候又可能有延时,你该怎么做?
1.3.有些时候需要每条数据有时间间隔,然后发送给485
1.4.如果你需要发送完一条以后,需要等待485回复呢?
2.为啥所有的串口都使用了缓存接收数据?
答:最简单的例子
485接收的数据转发给TCP
你想想如何解决下面的问题:
2.1 假设数据需要处理一下再发送给TCP,如果处理的时候又来了新数据怎么办?
2.2 如果TCP服务器故障,但是我还希望最近的一条数据在服务器恢复以后接着发出去?