以太网转RS485通讯类库封装

news2025/1/21 9:41:40

最近选用有人科技的以太网转RS485模块做项目,设备真漂亮,国货之光。调通了通讯的代码,发到网上供大家参考,多多交流。
在这里插入图片描述

以下分别是配套的头文件与源文件:

/***************************************************************
* Copyright(C) 2023,Company All Rights Reserved (1)版权说明
*
* @file    : Net2RS485.cpp (2) 文件名
*
* @brief   :  有人科技的网络转串口的通信类 (3) 文件描述
*
* @version : 1.0 (4) 版本信息
*
* @author  : 潘智斌 (5) 创建作者
*
* @date    : 2023/12/27 星期四
*
* Details  :
***************************************************************/
#ifndef _NET2RS485_H
#define _NET2RS485_H

#ifdef _WIN32
#include <io.h>
#else
#include <unistd.h>
#endif

#include <iostream>
#include <WinSock.h>
#include <sys/types.h>
//#include <string>
#include "DataDefine.h"
using namespace std;

#pragma comment(lib,"ws2_32.lib")

#define RETURN_OK 1
#define RETURN_ERR 0

class Net2RS485
{
private:
	WORD wVersion;
	WSADATA wdSockData;
	SOCKET clientSock;
	LidarPara para;
public:
	//打开数据通道
	int Open(string &ip, int &port);
	//关闭数据通道
	int Close();
	//发送数据的接口
	int Send(char *data, int len);
	//接收数据的接口
	int Recv(char *data, int &len);
};

#endif
/***************************************************************
* Copyright(C) 2023,Company All Rights Reserved (1)版权说明
*
* @file    : Net2RS485.cpp (2) 文件名
*
* @brief   :  有人科技的网络转串口的通信类 (3) 文件描述
*
* @version : 1.0 (4) 版本信息
*
* @author  : 潘智斌 (5) 创建作者
*
* @date    : 2023/12/27 星期三
*
* Details  :
***************************************************************/

#include "Net2RS485.h"

int Net2RS485::Open(string &ip, int &port)
{
	wVersion = MAKEWORD(2, 2);

	int ret = WSAStartup(wVersion, &wdSockData);			//启动 网络
	if (0 != ret)
	{
		printf("WSAStartup() failed : error() = %d\n", WSAGetLastError());
		system("pause");
		return -1;
	}

	if (2 != HIBYTE(wdSockData.wVersion) || 2 != LOBYTE(wdSockData.wVersion))	//校验版本
	{
		printf("version error\n");
		WSACleanup();
		system("pause");
		return RETURN_ERR;
	}

	clientSock = socket(AF_INET, SOCK_STREAM, 0);
	if (INVALID_SOCKET == clientSock)
	{
		printf("socket() failed , error() = %d\n", WSAGetLastError());
		WSACleanup();
		system("pause");
		return RETURN_ERR;
	}

	SOCKADDR_IN clientAddr;
	clientAddr.sin_family = AF_INET;
	clientAddr.sin_port = htons(port);
	clientAddr.sin_addr.s_addr = inet_addr(ip.data());

	ret = connect(clientSock, (sockaddr*)&clientAddr, sizeof(clientAddr));
	if (SOCKET_ERROR == ret)
	{
		printf("connect() failed, error : %d\n", WSAGetLastError());
		closesocket(clientSock);
		WSACleanup();
		//system("pause");
		return RETURN_ERR;
	}

	return RETURN_OK;
}

int Net2RS485::Close()
{
	closesocket(clientSock);
	WSACleanup();
	return RETURN_OK;
}

int Net2RS485::Send(char *data, int len)
{
	int result = send(clientSock, data, len, 0);
	if (SOCKET_ERROR == result)
	{
		printf("send() failed, error = %d\n", WSAGetLastError());
	}
	return RETURN_OK;
}
int Net2RS485::Recv(char *data, int &len)
{

	fd_set fdRead;
	FD_ZERO(&fdRead); //初始化
	FD_SET(clientSock, &fdRead);
	timeval tv = { 1, };
	int nRet = select(fdRead.fd_count, &fdRead, NULL, NULL, &tv);
	if (nRet == 0 || nRet == SOCKET_ERROR)
	{
		return RETURN_ERR;
	}

	//判断socket是否是可以读数据了
	if (FD_ISSET(clientSock, &fdRead))
	{
		len = recv(clientSock, data, 100, 0);
		if (len == 0 || len == SOCKET_ERROR)
		{
			printf("接受数据失败 \r\n");
			return RETURN_ERR;
		}
	}

	return RETURN_OK;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1347779.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Git 常用命令知识笔记

Git 仓库数据结构 Git 仓库由一个个的 commit 组成某些 commit 上会有一些 branch 指向它们&#xff0c;这些 branch 的本质是引用有一个特殊的引用叫做 HEAD&#xff0c;它始终指向当前的位置&#xff0c;这个位置可以是 commit&#xff0c;也可以是 branch staging area 暂存…

LTPI协议的理解——1、LTPI协议的定义和结构

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 LTPI协议的理解——1、LTPI协议的定义和结构 定义DC-SCM 2.0 LTPI 结构GPIO通道I2C/SMBus通道Uart通道OEM通道数据通道 总结 定义 LTPI (LVDS Tunneling Protocol & Int…

easyexcel 导出

在使用EasyExcel库进行数据写入时&#xff0c;通常我们会使用实体类来存储数据。但是当遇到动态查询&#xff0c;无法确定属性数量和名称时&#xff0c;就需要使用Map来接收数据。然而&#xff0c;直接将Map中的数据写入Excel表格并不是一件简单的事情。接下来&#xff0c;我将…

计算机操作系统(OS)——P3内存管理

1、内存的基础知识 学习目标&#xff1a; 什么是内存&#xff1f;有何作用&#xff1f; 内存可存放数据。程序执行前__需要先放内存中才能被CPU处理__——缓和CPU与硬盘之间的速度矛盾。 【思考】在多道程序程序下&#xff0c;系统会有多个进程并发执行&#xff0c;也就是说…

PyTorch常用工具(2)预训练模型

文章目录 前言2 预训练模型 前言 在训练神经网络的过程中需要用到很多的工具&#xff0c;最重要的是数据处理、可视化和GPU加速。本章主要介绍PyTorch在这些方面常用的工具模块&#xff0c;合理使用这些工具可以极大地提高编程效率。 由于内容较多&#xff0c;本文分成了五篇…

Centos8之更换DNF源

一、DNF包管理器简介 DNF&#xff08;Dandified Yum&#xff09;是一个用于Fedora、CentOS和RHEL等Linux发行版的包管理器。它是Yum&#xff08;Yellowdog Updater, Modified&#xff09;的下一代版本&#xff0c;旨在提供更快、更可靠的软件包管理体验。以下是一些DNF包管理器…

【YOLO系列】yolo V1 ,V3,V5,V8 解释

文章目录 yolo V1 模型结构图通道数 的 物理意义是什么&#xff1f;输出 7730 怎么理解&#xff1f;YOLO v1 损失函数LOSS yolo V3yolo V5yolo V8 视频来源&#xff1a;https://www.bilibili.com/video/BV13K411t7Zs/ AI视频小助理 一、YOLO系列的目标检测算法&#xff0c;其中…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《兼顾捕碳强度与可再生能源消纳的储能容量配置优化方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主的专栏栏目《论文与完整程序》 这个标题涉及到两个主要方面&#xff1a;捕碳强度和可再生能源的消纳&#xff0c;以及与之相关的储能容量配置的优化方法。下面我会逐一解读这两个方面&…

ES6之生成器(Generator)

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

OpenCV-11颜色通道的分离与合并

本次我们使用两个比较重要的API split&#xff08;mat&#xff09;将图像的通道进行分割。 merge&#xff08;(ch1&#xff0c;ch2&#xff0c;ch3)&#xff09;将多个通道进行融合。 示例代码如下&#xff1a; import cv2 import numpy as npimg np.zeros((480, 640, 3),…

HTML使用JavaScript的三种方式

要使用 JavaScript&#xff0c;你可以在 HTML 文件中的 <script> 标签中编写代码&#xff0c;或者将代码保存到一个单独的 .js 文件中并在 HTML 文件中引入。以下是一些常用的 JavaScript 使用方式&#xff1a; 内联 JavaScript&#xff1a;在 HTML 文件的 <script&g…

CodeWave赋能创新的全功能技术平台

目录 前言1 应用中心2 资产中心&#xff1a;汇聚创新能量&#xff0c;提供开发加速3 集成中心3.1 API管理3.2 报表管理 4 运维中心4.1 资源监控4.2 用户管理4.3 权限管理4.4 日志与监控 5 配置中心5.1 源码配置5.2 镜像仓库配置5.3 数据库配置5.4 报表配置5.5 资产配置5.6 品牌…

【小沐学NLP】Python实现K-Means聚类算法(nltk、sklearn)

文章目录 1、简介1.1 机器学习1.2 K 均值聚类1.2.1 聚类定义1.2.2 K-Means定义1.2.3 K-Means优缺点1.2.4 K-Means算法步骤 2、测试2.1 K-Means&#xff08;Python&#xff09;2.2 K-Means&#xff08;Sklearn&#xff09;2.2.1 例子1&#xff1a;数组分类2.2.2 例子2&#xff1…

有道翻译web端 爬虫, js

以下内容写于2023-12-28, 原链接为:https://fanyi.youdao.com/index.html#/ 1 在输入框内输入hello world进行翻译,通过检查发出的网络请求可以看到翻译文字的http接口应该是: 2 复制下链接最后的路径,去js文件中搜索下: 可以看到这里是定义了一个函数B来做文字的翻译接口函数…

IDEA JAVA Spring Boot运行Hello World(1.8)

参考资料&#xff1a; Spring Boot运行Hello World - 知乎https://blog.csdn.net/weixin_44005516/article/details/108293228(解决bug)SpringBoot入门第一章&#xff1a;Hello World-java教程-PHP中文网 (仅参考如何运行程序)java 8安装教程 java 8安装教程_java8安装-CSDN博…

开发Chrome插件获取当前页面Cookie

前言 看《重来》的时候有提到&#xff0c;把自己的需求做成产品&#xff0c;给更多人提供价值。 就是本篇的文章的由来。 我的需求场景&#xff0c;因为要用postman测公司开发的接口&#xff0c;公司接口通过cookie做鉴权&#xff0c; 所以我每次都要f12&#xff0c;然后从Ne…

Python筛选出批量下载的多时相遥感影像文件中缺失的日期

本文介绍批量下载大量多时相的遥感影像文件后&#xff0c;基于Python语言与每一景遥感影像文件的文件名&#xff0c;对这些已下载的影像文件加以缺失情况的核对&#xff0c;并自动统计、列出未下载影像所对应的时相的方法。 批量下载大量遥感影像文件对于RS学生与从业人员可谓十…

阿里后端实习一面面经

阿里后端实习一面面经 项目中使用到了es&#xff0c;es的作用&#xff1f; elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 es中的重要概念&#xff1f; 群集&#xff1a;一个或多个节点…

JavaScript元素根据父级元素宽高缩放

/*** 等比缩放* param wrap 外部容器* param container 待缩放的容器* returns {{width: number, height: number}}* 返回值&#xff1a;width:宽度, height:高度*/aspectRatio(wrap: any, container: any) {// w h / ratio, h w * ratioconst wrapW wrap.width;const wrapH…

PyTorch中常用的工具(3)TensorBoard

文章目录 前言3 可视化工具3.1 TensorBoard 前言 在训练神经网络的过程中需要用到很多的工具&#xff0c;最重要的是数据处理、可视化和GPU加速。本章主要介绍PyTorch在这些方面常用的工具模块&#xff0c;合理使用这些工具可以极大地提高编程效率。 由于内容较多&#xff0c…