W5500+STM32F103C8T6进行TCP通信(modbus)

一、w5500资料

  • w5500的资料就放在下面了,单纯的客户端和其他模式上面有教程

https://www.aliyundrive.com/s/enPnnZgNtpE

二、modbus通信

  • Modbus RTU通信时使用的数据帧结构如下图,而Moubus TCP通信的数据帧和这个稍微不一样,没有crc检验,因为tcp本就是一种可靠传输协议
    在这里插入图片描述

  • 这里是Modbus TCP数据帧
    在这里插入图片描述

  • 公共功能码定义在这里插入图片描述

三、从机代码

  • 关键代码,这里需要在开始定义一个全局变量data,每次调用都会使data++,而返回的数据就是把data置于数据位,值通过tcp回传回去,能在modbus poll里看到这个值
void Process_Socket_Data(SOCKET s)
{
	int len;
	unsigned char msg[11]={0x00,0x00,0x00 ,0x00, 0x00, 0x05, 0x01, 0x03, 0x02, 0x00, 0x70};
	len=sizeof(msg);
	unsigned short size;
	size=Read_SOCK_Data_Buffer(s, Rx_Buffer);
	memcpy(Tx_Buffer, Rx_Buffer, size);
	
	//打印查询报文
	for (int j=0;j<size;j++){
		 printf("0x%02X ",Tx_Buffer[j]);
	}

	//写响应报文
	//检验码
	msg[0]=Tx_Buffer[0];
	msg[1]=Tx_Buffer[1];
	
	//协议
	msg[2]=0x00;
	msg[3]=0x00;
	
	//数据包长度
	msg[4]=0x00;
	msg[5]=0x05;
	
	//设备编号
	msg[6]=Tx_Buffer[6];
	//功能码
	msg[7]=Tx_Buffer[7];
	//数据长度
	msg[8]=0x02;
	
	//低八位
	msg[10]=data&0XFF;
	//高八位
	msg[9]=data>>8;
	
	memcpy(Tx_Buffer, msg, len);	
	//发送响应报文
	Write_SOCK_Data_Buffer(0, Tx_Buffer, len);
	data++;
}

  • 代码下载链接

https://gitee.com/zxsjunqi/keilcode/tree/master/Modbus_TCP-main/Modbus_TCP-main

  • Modbus Poll读取设置
    在这里插入图片描述
  • 这里是通过TCP连接,地址就是代码里所写的,比如我是192.168.201.68,端口为5000,有个前提,要通信得先把前面的客户端例子调通,也就是需要修改适配器在这里插入图片描述
    在这里插入图片描述
  • 读取效果在这里插入图片描述

四、总结

modbus tcp通信原理基本清楚了,但在代码实现的时候却很犹豫,不知道拿什么来接收并应答,直到看到同学的博客之后,突然就明白了,大佬是真的强啊。

五、参考

STM32F103基于W5500实现Modbus简单TCP通信
Modbus TCP通信概述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值