STM32+W5500网络通信

文章目录

一、w5500简介

这个网络芯片通过硬件实现了TCP/IP协议栈,10/100M以太网数据链路层(MAC)及物理层(PHY);支持TCP、UDP、IPv4、ICMP、ARP、IGMP以及PPPoE。内嵌32K字节缓存。MCU通过SPI与其通讯来配置网络及进行网络通信,SPI速率达80MHz。

其上提供多达8个独立的socket(套接字),编号0-7,这个socket和平常所说的socket稍微有点差别。对于UDP,设置对应UDP后的操作和普通的socket差不多;但对于TCP,1个socket只能对应一条TCP链接,也就是说,比如你在一个端口上打开了监听TCP的如5000端口,然后使用两个TCP客户端去连接,结果是只有先连入的那个TCP链接能成功。为了在一个TCP端口上同时服务多个TCP链接,需要在多个socket上同时监听那个端口。

另稍微提一下,与W5500通讯的基本思想就是读写W5500的寄存器,来控制W5500的各种功能或读写数据,就好像我们在单片机上通过设置各个寄存器的值来操作各个模块,但因为它不是直接接在MCU的地址总线上的,所以要通过特定格式的SPI帧来间接实现操作寄存器。每次读写寄存器的时候先按固定格式指定起始地址,然后按序依次从MISO读取或从MOSI写入数据。同时还可能随带一些其他操作,比如可变数据长度模式下还需要在每次开始发送前拉低片选信号,发送结束后再拉高。(与可变数据长度模式对应的就是固定数据长度模式,这种模式下不需要频繁控制片选信号,但是在大量读写时就很蛋疼。现在版本的官方库中只支持可变数据长度模式,所以就不需要纠结这个事情了)

当然,这些细节操作官方的IO库已经都帮我们隐藏了,基本我们只需要调用库提供的api就行。

二、modbus通信

MODBUS协议是美国Modicon公司(现已被收购)首先推出的基于RS485总线的通信协议,有RS232/RS422/RS485接口标准。Modbus已经成为工业领域通信协议的业界标准,并且现在是工业电子设备之间常用的连接方式。
MODBUS协议是一种 主从式 串行异步 半双工 通信协议。
主从式 指通信设备中有一台主机和多台从机(最大约240个),主机可以和从站双向通信,可以和单独一个从站通信,或者所有从站同时通信(广播),这个时候不需要回应。而从站只能和主站通信,从站之间不能相互通信,从机也不会主动给主机发送信息,只会应答主机。
MODBUS主站同时只会发起一个事物处理,只会与一个从站通信

三、代码

  • 关键代码,这里需要在开始定义一个全局变量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++;
}


  • Modbus Poll读取设置
    STM32+W5500网络通信
  • 这里是通过TCP连接,端口为5000
    STM32+W5500网络通信
  • 读取效果
    STM32+W5500网络通信

四、总结

modbus tcp通信原理基本清楚。

五、参考链接

https://blog.csdn.net/qq_47281915/article/details/121927294?spm=1001.2014.3001.5501
https://link.csdn.net/?target=http%3A%2F%2Fwww.ad.siemens.com.cn%2Fproductportal%2FProds%2Fpublished%2FComm%2FComm_9.1%2FComm_9.1.html%23%3A~%3Atext%3DModbus%2520TCP%25E6%2595%25B0%25E6%258D%25AE%25E5%25B8%25A7%2520Modbus%25E6%2595%25B0%25E6%258D%25AE%25E5%259C%25A8TCP%2FIP%25E4%25BB%25A5%25E5%25A4%25AA%25E7%25BD%2591%25E4%25B8%258A%25E4%25BC%25A0%25E8%25BE%2593%25EF%25BC%258C%25E6%2594%25AF%25E6%258C%2581Ethernet%2520II%25E5%2592%258C802.3%25E4%25B8%25A4%25E7%25A7%258D%25E5%25B8%25A7%25E6%25A0%25BC%25E5%25BC%258F%25EF%25BC%258CModbus%2CTCP%25E6%2595%25B0%25E6%258D%25AE%25E5%25B8%25A7%25E5%258C%2585%25E5%2590%25AB%25E6%258A%25A5%25E6%2596%2587%25E5%25A4%25B4%25E3%2580%2581%25E5%258A%259F%25E8%2583%25BD%25E4%25BB%25A3%25E7%25A0%2581%25E5%2592%258C%25E6%2595%25B0%25E6%258D%25AE3%25E9%2583%25A8%25E5%2588%2586%25EF%25BC%258CMBAP%25E6%258A%25A5%25E6%2596%2587%25E5%25A4%25B4%2528MBAP%25E3%2580%2581Modbus%2520Application%2520Protocol%25E3%2580%2581Modbus%25E5%25BA%2594%25E7%2594%25A8%25E5%258D%258F%25E8%25AE%25AE%2529%25E5%2588%25864%25E4%25B8%25AA%25E5%259F%259F%25EF%25BC%258C%25E5%2585%25B17%25E4%25B8%25AA%25E5%25AD%2597%25E8%258A%2582%25EF%25BC%258C%25E5%25A6%2582%25E5%259B%25BE1%25E6%2589%2580%25E7%25A4%25BA%25EF%25BC%259A%2520%25E5%259B%25BE1%25EF%25BC%259AMODBUS%2520TCP%25E6%258A%25A5%25E6%2596%2587

上一篇:USB协议学习笔记 - HID 设备


下一篇:netcore 启用EnableRewind倒带解决只能读取一次body的问题