读取HL-G1测量值(例程)RS485通信 C++串口通信

2024-01-15 01:50

本文主要是介绍读取HL-G1测量值(例程)RS485通信 C++串口通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        本例中使用windows系统电脑作为上位机与松下激光位移产品HL-G1进行串口通信。HL-G1通过 RS485-RS232/USB 转接板与电脑相连,采用松下自定义协议进行通信。windows系统向传感器发出指令后会接受到返回数据,本例发送返回位移测量值命令。

        以下为windows环境下采用C++串口通信例程,供读者参考。

#include <iostream>
#include <string>
#include <windows.h>
#include <cstdlib>class TFSerialPort
{
public:TFSerialPort(std::string portNum, DWORD baudRate = 38400, BYTE byteSize = 8, BYTE parityBit = NOPARITY, BYTE stopBit = ONESTOPBIT){m_portNum = portNum;m_dwBaudrate = baudRate;m_byteSize = byteSize;m_parityBit = parityBit;m_stopBit = stopBit;m_bOpen = false;}~TFSerialPort(){}public:HANDLE m_hCom;          //句柄std::string m_portNum;  //串口号DWORD m_dwBaudrate;     //波特率BYTE  m_byteSize;       //数据位BYTE  m_parityBit;      //校验位BYTE  m_stopBit;        //停止位bool  m_bOpen;          //串口开关标志//打开com口bool openCom(){m_hCom = CreateFileA(m_portNum.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);if (m_hCom == INVALID_HANDLE_VALUE){}else{DCB dcb;if (!SetupComm(m_hCom, 1024, 1024)){}else{}GetCommState(m_hCom, &dcb);dcb.BaudRate = m_dwBaudrate;dcb.ByteSize = m_byteSize;dcb.Parity = m_parityBit;dcb.StopBits = m_stopBit;if (!SetCommState(m_hCom, &dcb)){return false;}else{PurgeComm(m_hCom, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);m_bOpen = true;return true;}}}//关闭com口void closeCom(){CloseHandle(m_hCom);}//写入数据bool writeToCom(BYTE data[], DWORD dwLength){DWORD dwError = 0;if (ClearCommError(m_hCom, &dwError, NULL) && dwError > 0){PurgeComm(m_hCom, PURGE_TXABORT | PURGE_TXCLEAR);}DWORD dwTx = 0;BOOL ret = FALSE;ret = WriteFile(m_hCom, data, dwLength, &dwTx, NULL);if (ret == FALSE){return false;}else{return true;}}//读取数据bool readFromCom(BYTE readBuffer[], DWORD dwLength){COMSTAT comStat;DWORD dwError = 0;if (ClearCommError(m_hCom, &dwError, &comStat) && dwError > 0)      //清除错误{PurgeComm(m_hCom, PURGE_RXABORT | PURGE_RXCLEAR);               //清空缓冲区}DWORD dwRx = 0;		                                                // 读入的字节数BOOL ret = FALSE;ret = ReadFile(m_hCom, readBuffer, dwLength, &dwRx, NULL);	        // 读入数据if (ret == TRUE){return true;}else{return false;}}
};int main()
{std::string comPort = "COM6";               //定义COM口TFSerialPort tfserialPort(comPort);BYTE sendBuff[] = {"%01#RMD**\r"};          //发送空间,写入获取距离指令BYTE recvBuff[20] = { 0 };                  //接收空间CHAR order = NULL;tfserialPort.openCom();                     //打开COM口//循环发送接收串口数据并显示while (true){//发送命令printf("Touch the Enter key to send request:");scanf_s("%c", &order);if (order != NULL){ tfserialPort.writeToCom(sendBuff, 10); }          //发送获取距离指令else{ break; }//接收命令tfserialPort.readFromCom(recvBuff, 18);if (recvBuff[0] == '%' && recvBuff[17] == '\r'){printf("result: ");for ( int i = 7 ; i < 11 ; i++){ printf("%c", recvBuff[i]); }printf(".");for (int i = 11; i < 15; i++){ printf("%c", recvBuff[i]); }printf("\n");}else{ printf("No Data!!! \r"); }}tfserialPort.closeCom();                    //关闭端口system("pause");                            //挂机return 0;
}

        运行结果如下图所示

        图中从上至下依次显示无量块放置、放置1mm厚量块 、放置2mm厚量块 、放置3mm厚量块情况下的四个测量结果,测量结果单位为毫米,四个测量值间距约为1mm。 

这篇关于读取HL-G1测量值(例程)RS485通信 C++串口通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/607255

相关文章

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

Java读取InfluxDB数据库的方法详解

《Java读取InfluxDB数据库的方法详解》本文介绍基于Java语言,读取InfluxDB数据库的方法,包括读取InfluxDB的所有数据库,以及指定数据库中的measurement、field、... 首先,创建一个Java项目,用于撰写代码。接下来,配置所需要的依赖;这里我们就选择可用于与Infl

C#读取本地网络配置信息全攻略分享

《C#读取本地网络配置信息全攻略分享》在当今数字化时代,网络已深度融入我们生活与工作的方方面面,对于软件开发而言,掌握本地计算机的网络配置信息显得尤为关键,而在C#编程的世界里,我们又该如何巧妙地读取... 目录一、引言二、C# 读取本地网络配置信息的基础准备2.1 引入关键命名空间2.2 理解核心类与方法

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

SpringBoot使用Apache POI库读取Excel文件的操作详解

《SpringBoot使用ApachePOI库读取Excel文件的操作详解》在日常开发中,我们经常需要处理Excel文件中的数据,无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到... 目录项目背景依赖导入读取Excel模板的实现代码实现代码解析ExcelDemoInfoDTO 数据传输

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

Python读取TIF文件的两种方法实现

《Python读取TIF文件的两种方法实现》本文主要介绍了Python读取TIF文件的两种方法实现,包括使用tifffile库和Pillow库逐帧读取TIFF文件,具有一定的参考价值,感兴趣的可以了解... 目录方法 1:使用 tifffile 逐帧读取安装 tifffile:逐帧读取代码:方法 2:使用

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数