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通信原理基本清楚了,但在代码实现的时候却很犹豫,不知道拿什么来接收并应答,直到看到同学的博客之后,突然就明白了,大佬是真的强啊。
五、参考
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
每日一题——分割等和子集