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("\r\n接收到消息:\r\n");
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服务器故障,但是我还希望最近的一条数据在服务器恢复以后接着发出去?