当前位置: 首页 > news >正文

8.26网络编程——Modbus TCP

文章目录

  • 一、思维导图
  • 二、在虚拟机写程序实现 poll 端功能,编写客户端实现和 Slave 通信
    • 1> 单线圈数据的设置
    • 2> 单线圈数据的读取
    • 3> 多线圈数据的设置
    • 4> 多寄存器数据的读取
    • 5> 多寄存器数据的设置
    • 6> 单寄存器数据的读取
  • 三、牛客网刷题

一、思维导图

在这里插入图片描述

二、在虚拟机写程序实现 poll 端功能,编写客户端实现和 Slave 通信

1> 单线圈数据的设置

#include <myhead.h>
int main(int argc, const char *argv[])
{unsigned char buf[128] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x05, 0x00, 0x09, 0xFF, 0x00};// 设置套接字int sock = socket(AF_INET, SOCK_STREAM, 0);if (sock == -1){printf("%d ", __LINE__);perror("socket error");return -1;}// 封装服务器的地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(502);sin.sin_addr.s_addr = inet_addr("192.168.108.128"); // 服务器IP地址/*//连接服务器if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");*/// 数据收发unsigned char replyBuf[128] = "";while (1){// 连接服务器if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");// 将请求包发送给服务器if (send(sock, buf, sizeof(buf), 0) == -1){perror("send error");return -1;}// 读取服务器发来的消息bzero(replyBuf, sizeof(replyBuf));int res = recv(sock, replyBuf, sizeof(replyBuf), 0);for (int i = 0; i < res; i++){printf("%#02x ", replyBuf[i]);}// printf("res = %d\n",res);printf("\n");printf("res = %d\n", res);sleep(1);}close(sock);return 0;
}

2> 单线圈数据的读取

#include <myhead.h>
int main(int argc, const char *argv[])
{unsigned char buf[128] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x01, 0x00, 0x08, 0x00, 0x01};// 设置套接字int sock = socket(AF_INET, SOCK_STREAM, 0);if (sock == -1){printf("%d ", __LINE__);perror("socket error");return -1;}// 封装服务器的地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(502);sin.sin_addr.s_addr = inet_addr("192.168.108.128"); // 服务器IP地址/*//连接服务器if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");*/// 数据收发unsigned char replyBuf[128] = "";while (1){// 连接服务器if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");// 将请求包发送给服务器if (send(sock, buf, sizeof(buf), 0) == -1){perror("send error");return -1;}// 读取服务器发来的消息bzero(replyBuf, sizeof(replyBuf));int res = recv(sock, replyBuf, sizeof(replyBuf), 0);for (int i = 0; i < res; i++){printf("%#02x ", replyBuf[i]);}// printf("res = %d\n",res);printf("\n");printf("res = %d\n", res);sleep(1);}close(sock);return 0;
}

3> 多线圈数据的设置

#include <myhead.h>
int main(int argc, const char *argv[])
{unsigned char buf[128] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x0F, 0x00, 0x01, 0x00, 0x02,0x01,0x0F};// 设置套接字int sock = socket(AF_INET, SOCK_STREAM, 0);if (sock == -1){printf("%d ", __LINE__);perror("socket error");return -1;}// 封装服务器的地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(502);sin.sin_addr.s_addr = inet_addr("192.168.108.128"); // 服务器IP地址/*//连接服务器if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");*/// 数据收发unsigned char replyBuf[128] = "";while (1){// 连接服务器if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");// 将请求包发送给服务器if (send(sock, buf, sizeof(buf), 0) == -1){perror("send error");return -1;}// 读取服务器发来的消息bzero(replyBuf, sizeof(replyBuf));int res = recv(sock, replyBuf, sizeof(replyBuf), 0);for (int i = 0; i < res; i++){printf("%#02x ", replyBuf[i]);}// printf("res = %d\n",res);printf("\n");printf("res = %d\n", res);sleep(1);}close(sock);return 0;
}

4> 多寄存器数据的读取

#include <myhead.h>
int main(int argc, const char *argv[])
{unsigned char buf[128] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x01, 0x00, 0x02};// 设置套接字int sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == -1){printf("%d ", __LINE__);perror("socket error");return -1;}// 封装服务器的地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(502);sin.sin_addr.s_addr = inet_addr("192.168.108.128"); // 服务器IP地址/*//连接服务器if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");*/// 数据收发unsigned char replyBuf[128] = "";while (1){// 连接服务器if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");// 将请求包发送给服务器if (send(sock, buf, sizeof(buf), 0) == -1){perror("send error");return -1;}// 读取服务器发来的消息bzero(replyBuf, sizeof(replyBuf));int res = recv(sock, replyBuf, sizeof(replyBuf), 0);for (int i = 0; i < res; i++){printf("%#02x ", replyBuf[i]);}// printf("res = %d\n",res);printf("\n");printf("res = %d\n", res);sleep(1);}close(sock);return 0;
}

5> 多寄存器数据的设置

#include <myhead.h>
int main(int argc, const char *argv[])
{unsigned char buf[128] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x01, 0x10, 0x00, 0x01, 0x00, 0x01,0x02,0x00,0x0F};// 设置套接字int sock = socket(AF_INET, SOCK_STREAM, 0);if (sock == -1){printf("%d ", __LINE__);perror("socket error");return -1;}// 封装服务器的地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(502);sin.sin_addr.s_addr = inet_addr("192.168.108.128"); // 服务器IP地址/*//连接服务器if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");*/// 数据收发unsigned char replyBuf[128] = "";while (1){// 连接服务器if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");// 将请求包发送给服务器if (send(sock, buf, sizeof(buf), 0) == -1){perror("send error");return -1;}// 读取服务器发来的消息bzero(replyBuf, sizeof(replyBuf));int res = recv(sock, replyBuf, sizeof(replyBuf), 0);for (int i = 0; i < res; i++){printf("%#02x ", replyBuf[i]);}// printf("res = %d\n",res);printf("\n");printf("res = %d\n", res);sleep(1);}close(sock);return 0;
}

6> 单寄存器数据的读取

#include <myhead.h>
int main(int argc, const char *argv[])
{unsigned char buf[128] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x04, 0x00, 0x01, 0x00, 0x02};// 设置套接字int sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == -1){printf("%d ", __LINE__);perror("socket error");return -1;}// 封装服务器的地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(502);sin.sin_addr.s_addr = inet_addr("192.168.108.128"); // 服务器IP地址/*//连接服务器if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");*/// 数据收发unsigned char replyBuf[128] = "";while (1){// 连接服务器if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("连接服务器成功\n");// 将请求包发送给服务器if (send(sock, buf, sizeof(buf), 0) == -1){perror("send error");return -1;}// 读取服务器发来的消息bzero(replyBuf, sizeof(replyBuf));int res = recv(sock, replyBuf, sizeof(replyBuf), 0);for (int i = 0; i < res; i++){printf("%#02x ", replyBuf[i]);}// printf("res = %d\n",res);printf("\n");printf("res = %d\n", res);sleep(1);}close(sock);return 0;
}

三、牛客网刷题

在这里插入图片描述

http://www.dtcms.com/a/352391.html

相关文章:

  • Git 高级技巧:利用 Cherry Pick 实现远程仓库的同步合并
  • 【自然语言处理与大模型】微调数据集如何构建
  • docker 的网络
  • shell默认命令替代、fzf
  • RCC_APB2PeriphClockCmd
  • sdi开发说明
  • 推荐系统王树森(三)粗排精排
  • STM32的Sg90舵机
  • Python入门教程之字符串类型
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(20):文法+单词第7回2
  • iPhone 17 Pro 全新配色确定,首款折叠屏 iPhone 将配备 Touch ID 及四颗镜头
  • 【测试需求分析】-需求类型的初步分析(二)
  • 【NuGet】引用nuget包后构建项目简单解析
  • day41-动静分离
  • 数字时代下的智能信息传播引擎
  • 仿真干货|解析Abaqus AMD的兼容与并行效率问题
  • 基于硅基流动API构建智能聊天应用的完整指南
  • 使用QML的Rectangle组件的边框属性
  • `stat` 系统调用详解
  • 学习碎片02
  • Firefox Relay 体验
  • Redis支持事务吗?了解Redis的持久化机制吗?
  • 面试八股文之——Java集合
  • 115、【OS】【Nuttx】【周边】效果呈现方案解析:重定向命令
  • Python编程快速上手—让繁琐工作自动化
  • 论文阅读-CompletionFormer
  • (我与爬虫的较量)码上爬第5题
  • JDK 8 → JDK 17 升级说明书(面向 Spring Boot / Spring Cloud / Spring )
  • Filter过滤器入门
  • android 事件处理源码