读取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#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

如何使用 Python 读取 Excel 数据

《如何使用Python读取Excel数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Spring Boot读取配置文件的五种方式小结

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进... 目录1. 配置文件位置与加载顺序2. 读取配置文件的方式汇总方式一:使用 @Value 注解读取配置方式二

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

基于Python实现读取嵌套压缩包下文件的方法

《基于Python实现读取嵌套压缩包下文件的方法》工作中遇到的问题,需要用Python实现嵌套压缩包下文件读取,本文给大家介绍了详细的解决方法,并有相关的代码示例供大家参考,需要的朋友可以参考下... 目录思路完整代码代码优化思路打开外层zip压缩包并遍历文件:使用with zipfile.ZipFil

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve