📄 comport.h
字号:
#if !defined(AFX_COMPORT_H__7BE28122_D8E2_4F7A_AB9A_3287F1B1F7FB__INCLUDED_)
#define AFX_COMPORT_H__7BE28122_D8E2_4F7A_AB9A_3287F1B1F7FB__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <moxa/devices.h>
#include "MyCriticalSection.h"
//#include "Ini.h"
#include "IniFile.h"
#define MAX_DATA_LEN 128
/*typedef struct _TAG
{
int m_nReg; //寄存器类型:1、AI 2、DI
DWORD m_hKey; //句柄
DWORD m_dwCyc; //扫描周期(ms)
long m_nAddr; //测点地址
//CCriticalSection m_csSync; //同步对象
char m_sAdd[256];
float m_fCoef; //系数
}TAG;*/
typedef struct _DCBSTRUCT
{
WCHAR* byCommPort; // zero based port - 3 or higher implies TELNET
BYTE byXonXoff;
BYTE byByteSize;
BYTE byFlowCtrl;
BYTE byParity;
BYTE byStopBits;
DWORD dwBaudRate;
} DCBSTRUCT;
typedef struct _CONNECTION
{
HANDLE hCommDev; //串行口句柄
bool bConnected; //链接状态
DWORD dwThreadID;
} CONNECTION, *LPCONNECTION;
typedef int CALLBACK MONITORPROC(unsigned char *, int, LPARAM);//串口读线程回调函数
typedef MONITORPROC *LPMONITORPROC;
typedef struct _MONITORPROCPARMS
{
LPCONNECTION lpConn;
LPMONITORPROC lpCallback; //定义指向回调函数的指针
LPARAM lpCallbackParam;
} MONITORPROCPARAMS, *LPMONITORPROCPARAMS;
typedef struct _CHANNEL_DATA//存取通道号和解析后的数据
{
BYTE address;//卡件地址
BYTE devicetype;//卡件类型(AI8MA,AI8RTD)
BYTE DataType;//卡件类型(AI8MA,AI8RTD)
int CHANumber;//每个卡件的通道数,可根据卡件类型进行选择
int RegNumber;//每个卡件的寄存器数,可根据卡件类型进行选择
float fValue;//浮点型卡件时
WORD wValue;//16位整型卡件时,对应8个通道的8个整型数据
DWORD dwValue;//32位整型卡件
} CHANNEL_DATA,*LPCHANNEL_DATA;
struct TAG
{
CHANNEL_DATA *pMod;
BYTE nAddr;
BYTE nDataType;
};
extern class CComPort m_comport;//声明外部对象,给其他类文件中调用
class CComPort
{
public:
CComPort();
virtual ~CComPort();
static DWORD comReadThread(LPVOID param);
static DWORD WINAPI comWriteThread(LPVOID param);
void LoadIniFiles();
bool OpenComm();
bool OpenCommPort();
bool CloseComm();
void CloseReadThread();
void CloseWriteThread();
bool Monitor(LPMONITORPROC lpMonitorProc, LPARAM lParam=NULL);
bool WriteComm(BYTE *buf, DWORD dwLength);
static int CALLBACK MonitorCallbackGprs(unsigned char *pBuf, int nLen, LPARAM lParam);//定义了回调函数
//bool WriteCommMsg(BYTE *buf, DWORD buflen);//主函数调用,但是这种通过发送线程消息方法来调用写线程函数(写线程函数调用写串口函数)
static unsigned short CRC16(unsigned char* puchMsg, unsigned short usDataLen);//CRC16位校验
void ChangeData(unsigned char *buf, int i, int j);//寄存器值的高位和低位互调
void DataDispose();//数据处理
/////////////MODBUS通讯vairables////////////
DCBSTRUCT m_dcb;
CMyCriticalSection m_csSync;
DWORD m_hCurKey; //已使用的测点关键字
//CIni m_ini;
unsigned char m_byRec[100]; //串口数据接收缓存
long m_nRec; //已接收的数据长度
int m_nCommPort; //串口号
int m_nStation; //从站号
int counts;//获取配置文件中卡件的个数
unsigned char m_Reg4[100]; //11个寄存器,功能码3
unsigned char m_Reg4Status[100]; //11个寄存器时(该情况定义为4),数据的状态
unsigned char m_Reg3[100]; //9个寄存器
unsigned char m_Reg3Status[100]; //9个寄存器时(该情况定义为3),数据的状态
unsigned char m_byType;//数据类型 1:float 2: WORD 3: DWORD
private:
bool m_bPortOpened; // 表示串行口连接否
HGLOBAL m_hConn;//指向全局内存句柄 GlobalLock GlobalAlloc GlobalUnLockTop
LPMONITORPROCPARAMS m_pMPP;
HGLOBAL m_hMPP;
HANDLE m_hThread;
LPCONNECTION m_pConn;//定义结构体变量指针
//读写线程句柄
HANDLE m_hReadThread;//未用
HANDLE m_hWriteThread;
//读写线程ID标识
DWORD m_dwReadThreadID;//未用
DWORD m_dwWriteThreadID;
//读线程退出事件
HANDLE m_hReadCloseEvent;
//写线程退出事件
HANDLE m_hWriteCloseEvent;
//解析数据完成事件标志
HANDLE m_hDataDisposeCloseEvent;
};
#endif // !defined(AFX_COMPORT_H__7BE28122_D8E2_4F7A_AB9A_3287F1B1F7FB__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -