⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comport.h

📁 EVC(嵌入式VC++)发的用于串口通信的程序
💻 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 + -