From 7d93cc5a080a1a917ee4c473513256a7177cf2b2 Mon Sep 17 00:00:00 2001 From: zcn1123 <2363211205@qq.com> Date: Tue, 1 Sep 2020 21:10:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=83=A8=E5=88=86bug?= =?UTF-8?q?=EF=BC=8CRTU=E4=BA=A4=E4=BA=92=E6=A8=A1=E5=9D=97=E5=9F=BA?= =?UTF-8?q?=E6=9C=AC=E5=88=92=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modbus_RTU_Salve/Modbus_RTU_Salve.vcxproj | 6 +- .../Modbus_RTU_Salve.vcxproj.filters | 10 +- .../Modbus_RTU_Salve/RTU_Salve.cpp | 73 +++++++++- .../Modbus_RTU_Salve/RTU_Salve.h | 6 + .../Modbus_RTU_Salve/common.cpp | 127 +++++++++--------- .../Modbus_RTU_Salve/common.h | 6 +- Modbus_communication/Modbus_RTU_Salve/main.h | 2 +- 7 files changed, 154 insertions(+), 76 deletions(-) diff --git a/Modbus_communication/Modbus_RTU_Salve/Modbus_RTU_Salve.vcxproj b/Modbus_communication/Modbus_RTU_Salve/Modbus_RTU_Salve.vcxproj index 06c5c74..2027d34 100644 --- a/Modbus_communication/Modbus_RTU_Salve/Modbus_RTU_Salve.vcxproj +++ b/Modbus_communication/Modbus_RTU_Salve/Modbus_RTU_Salve.vcxproj @@ -64,12 +64,14 @@ + - + + - + diff --git a/Modbus_communication/Modbus_RTU_Salve/Modbus_RTU_Salve.vcxproj.filters b/Modbus_communication/Modbus_RTU_Salve/Modbus_RTU_Salve.vcxproj.filters index db7e967..a3821d0 100644 --- a/Modbus_communication/Modbus_RTU_Salve/Modbus_RTU_Salve.vcxproj.filters +++ b/Modbus_communication/Modbus_RTU_Salve/Modbus_RTU_Salve.vcxproj.filters @@ -18,7 +18,10 @@ 源文件 - + + 源文件 + + 源文件 @@ -26,7 +29,10 @@ 头文件 - + + 头文件 + + 头文件 diff --git a/Modbus_communication/Modbus_RTU_Salve/RTU_Salve.cpp b/Modbus_communication/Modbus_RTU_Salve/RTU_Salve.cpp index 70eae14..058c43b 100644 --- a/Modbus_communication/Modbus_RTU_Salve/RTU_Salve.cpp +++ b/Modbus_communication/Modbus_RTU_Salve/RTU_Salve.cpp @@ -1 +1,72 @@ -#include +#include "RTU_Salve.h" + +char read_buf[MAX_NUMBER]; + + + +/********************************************************************************************* +* 功能     :  获取串口读取缓存区中数据的字节数 +* 描述    : 向串口写入数据 +* 返回值 : 缓存区中数据的字节数 +* m_hComm : 串口句柄 +********************************************************************************************/ +unsigned int GetBytesInCOM(HANDLE m_hComm) +{ + DWORD dwError = 0; /** 错误码 */ + COMSTAT comstat; /** COMSTAT结构体,记录通信设备的状态信息 */ + memset(&comstat, 0, sizeof(COMSTAT)); + + unsigned int BytesInQue = 0; + /** 在调用ReadFile和WriteFile之前,通过本函数清除以前遗留的错误标志 */ + if (ClearCommError(m_hComm, &dwError, &comstat)) + { + BytesInQue = comstat.cbInQue; /** 获取在输入缓冲区中的字节数 */ + } + return BytesInQue; +} + + + +int test(void) +{ + string COMM; + cin >> COMM; + HANDLE Handle_Com = Init_COM((LPCTSTR)COMM.c_str(), 9600, 8, 0, 1); + if (Handle_Com == INVALID_HANDLE_VALUE) + { + cout << "初始化串口失败" << endl; + getchar(); + return 0; + } + + char write_buf[MAX_NUMBER]; + memset(write_buf, 0, MAX_NUMBER); + DWORD dwRead; + while (true) + { + //RTU主站,生成并发送请求,计时,读取响应报文,先发送后接收 + //生成请求报文 + //发送请求报文 + + PurgeComm(Handle_Com, PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR | PURGE_TXABORT);//清除缓存 + while (1) + { + if (true == SendData(Handle_Com, "ok", 2)) + { + cout << "发送请求报文成功" << endl; + break; + } + } + BOOL bReadOK = ReadFile(Handle_Com, read_buf, 256, &dwRead, NULL); + if (bReadOK && (dwRead > 0)) + { + read_buf[dwRead] = '\0'; + printf("收到响应:%s \r\n", read_buf); + } + else + cout << "loss" << endl; + } + CloseHandle(Handle_Com); + getchar(); + return 0; +} diff --git a/Modbus_communication/Modbus_RTU_Salve/RTU_Salve.h b/Modbus_communication/Modbus_RTU_Salve/RTU_Salve.h index e69de29..33396fb 100644 --- a/Modbus_communication/Modbus_RTU_Salve/RTU_Salve.h +++ b/Modbus_communication/Modbus_RTU_Salve/RTU_Salve.h @@ -0,0 +1,6 @@ +#ifndef __RTU_SALVE_H +#define __RTU_SALVE_H + +#include "common.h" + +#endif \ No newline at end of file diff --git a/Modbus_communication/Modbus_RTU_Salve/common.cpp b/Modbus_communication/Modbus_RTU_Salve/common.cpp index 7fe1425..e151fe4 100644 --- a/Modbus_communication/Modbus_RTU_Salve/common.cpp +++ b/Modbus_communication/Modbus_RTU_Salve/common.cpp @@ -1,6 +1,4 @@ -#include "RTU_common.h" - -char read_buf[MAX_NUMBER]; +#include "common.h" /*******************************************************************************************  * 功能     : 打开串口 @@ -9,10 +7,6 @@ char read_buf[MAX_NUMBER]; * date_bits: 数据位(有效范围4~8) * stop_bit : 停止位 * parity   : 奇偶校验。默认为无校验。NOPARITY 0; ODDPARITY 1;EVENPARITY 2 - - * dcb.StopBits= 0,1,2对应的是1bit,1.5bits,2bits. - * dcb.ByteSize=6,7,8时 dcb.StopBits不能为1 - * dcb.ByteSize=5时 dcb.StopBits不能为2 ********************************************************************************************/ HANDLE Init_COM(LPCTSTR Port, int baud_rate, BYTE date_bits, BYTE stop_bit, BYTE parity) { @@ -70,7 +64,7 @@ HANDLE Init_COM(LPCTSTR Port, int baud_rate, BYTE date_bits, BYTE stop_bit, BYTE * m_hComm : 串口句柄 * data : 要写入的数据 * len : 写入数据的长度 -********************************************************************************************/ +**********************************************************************************************/ bool SendData(HANDLE m_hComm, char* data, int len) { if (m_hComm == INVALID_HANDLE_VALUE) @@ -89,26 +83,11 @@ bool SendData(HANDLE m_hComm, char* data, int len) } /********************************************************************************************* -* 功能     :  获取串口读取缓存区中数据的字节数 -* 描述    : 向串口写入数据 -* 返回值 : 缓存区中数据的字节数 -* m_hComm : 串口句柄 -********************************************************************************************/ -unsigned int GetBytesInCOM(HANDLE m_hComm) -{ - DWORD dwError = 0; /** 错误码 */ - COMSTAT comstat; /** COMSTAT结构体,记录通信设备的状态信息 */ - memset(&comstat, 0, sizeof(COMSTAT)); - - unsigned int BytesInQue = 0; - /** 在调用ReadFile和WriteFile之前,通过本函数清除以前遗留的错误标志 */ - if (ClearCommError(m_hComm, &dwError, &comstat)) - { - BytesInQue = comstat.cbInQue; /** 获取在输入缓冲区中的字节数 */ - } - return BytesInQue; -} - +* 功能     :  Ms延时器 +* 描述    : ms级准确延时 +* 输入 : lTime 延时的ms数 +* 返回值 : 无 +**********************************************************************************************/ void MSleep(long lTime) { LARGE_INTEGER litmp; @@ -129,46 +108,60 @@ void MSleep(long lTime) } while (dfTim> COMM; - HANDLE Handle_Com = Init_COM((LPCTSTR)COMM.c_str(), 9600, 8, 0, 1); - if (Handle_Com == INVALID_HANDLE_VALUE) - { - cout << "初始化串口失败" << endl; - getchar(); - return 0; - } + +} - char write_buf[MAX_NUMBER]; - memset(write_buf, 0, MAX_NUMBER); - DWORD dwRead; - while (true) - { - //RTU主站,生成并发送请求,计时,读取响应报文,先发送后接收 - //生成请求报文 - //发送请求报文 +/********************************************************************************************* +* 功能     :  输入波特率 +* 描述    : 获取串口通信的波特率 +* 输入 : 无 +* 返回值 : Boud_Rate 波特率 +**********************************************************************************************/ +unsigned int Input_Boud_Rate(void) +{ + +} + +/********************************************************************************************* +* 功能     :  输入数据位 +* 描述    : 获取串口通信的数据位个数 +* 输入 : 无 +* 返回值 : Date_Bits 数据位 +**********************************************************************************************/ +unsigned int Input_Date_Bits(void) +{ + +} + +/********************************************************************************************* +* 功能     :  输入停止位 +* 描述    : 获取串口通信的停止位 +* 输入 : Date_Bits 数据位 +* Stop_Bits= 0,1,2对应的是1bit,1.5bits,2bits. +* Date_Bits=6,7,8时 Stop_Bits不能为1 +* Date_Bits=5时 Stop_Bits不能为2 +* 返回值 : Stop_Bits 数据位 +**********************************************************************************************/ +unsigned int Input_Stop_Bits(unsigned int Date_Bits) +{ + +} + +/********************************************************************************************* +* 功能     :  选择校验位 +* 描述    : 获取串口通信的校验位 +* 输入 : 无 +* 返回值 : Parity数据位 +**********************************************************************************************/ +unsigned int Input_Parity(void) +{ - PurgeComm(Handle_Com, PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR | PURGE_TXABORT);//清除缓存 - while (1) - { - if (true == SendData(Handle_Com, "ok", 2)) - { - cout << "发送请求报文成功" << endl; - break; - } - } - BOOL bReadOK = ReadFile(Handle_Com, read_buf, 256, &dwRead, NULL); - if (bReadOK && (dwRead > 0)) - { - read_buf[dwRead] = '\0'; - printf("收到响应:%s \r\n", read_buf); - } - else - cout << "loss" << endl; - } - CloseHandle(Handle_Com); - getchar(); - return 0; } \ No newline at end of file diff --git a/Modbus_communication/Modbus_RTU_Salve/common.h b/Modbus_communication/Modbus_RTU_Salve/common.h index 114ffed..2a76c61 100644 --- a/Modbus_communication/Modbus_RTU_Salve/common.h +++ b/Modbus_communication/Modbus_RTU_Salve/common.h @@ -1,5 +1,5 @@ -#ifndef __RTU_COMMON_H -#define __RTU_COMMON_H +#ifndef __COMMON_H +#define __COMMON_H #include #include @@ -8,5 +8,5 @@ using namespace std; #define MAX_NUMBER 300 -int test(); + #endif \ No newline at end of file diff --git a/Modbus_communication/Modbus_RTU_Salve/main.h b/Modbus_communication/Modbus_RTU_Salve/main.h index 9524beb..fa09b0d 100644 --- a/Modbus_communication/Modbus_RTU_Salve/main.h +++ b/Modbus_communication/Modbus_RTU_Salve/main.h @@ -1,6 +1,6 @@ #ifndef __MAIN_H #define __MAIN_H -#include "RTU_common.h" +#include "RTU_Salve.h" #endif \ No newline at end of file