一个 DLL, (涉及STL, AT, SerialPort, 集中器协议)很不错喔!


#pragma warning(disable:4231)
#pragma warning(disable:4273)
#pragma warning(disable:4786)

#include "stdafx.h"
#include <string>
#include <vector>
using namespace std;

#include "SerialPort.h"

#ifdef  DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#define EXPIMP_TEMPLATE
#else
#define DLL_API __declspec(dllimport)
#define EXPIMP_TEMPLATE extern
#endif

//电量结构
class dlValue
{
public:
 dlValue(){}
 char time[20];//时间
 char meterCode[30];//电表号
 char zdl[20];//总电量(千瓦时)
 char fdl[20];//峰电量(千瓦时)
 char gdl[20];//谷电量(千瓦时)
 char jdl[20];//尖电量(千瓦时)
 char pdl[20];//平电量(千瓦时)
public:
 BOOL operator < (const dlValue &c) const {return TRUE;}
 BOOL operator == (const dlValue &c) const {return TRUE;}
};

//费率设置结构
class setFeeRate
{
public:
 setFeeRate(){}
 char mark[3];//费率标志 01---代表峰, 02---代表谷,03---代表尖, 04---代表平.
 char time[20];//时间 hh:mm:ss-hh:mm:ss (开始时间-结束时间)
public:
 BOOL operator < (const setFeeRate &c) const {return TRUE;}
 BOOL operator == (const setFeeRate &c) const {return TRUE;} 
};

//--输入参数ca:
struct commArg
{
 char port[10];//端口号 例如:1   2等
 char baudRate[10];//波特率  例如:9600 2400等
 char telCode[30];//电话号码 例如 02423974200 等
 char ip[25];//ip:port 例如:192.168.1.1:8080
} ;

//--输出参数rtn:
struct centerParam
{
 char meterNum[5];// 电表个数
 char centerTime[20];// 集中器当前时间 yyyy-mm-dd hh:mm:ss
 char freezeIt[20];// 冻结时间 dd hh:mm:ss(dd为日期,hh为小时,mm为分钟,ss为秒)
} ;

//显示实例化模板类
EXPIMP_TEMPLATE template class DLL_API std::vector<string>;
EXPIMP_TEMPLATE template class DLL_API std::vector<dlValue>;
EXPIMP_TEMPLATE template class DLL_API std::vector<setFeeRate>;

typedef std::vector<string> pchVct;
typedef std::vector<dlValue> structVctDL;
typedef std::vector<setFeeRate> structVctFeeRate;

class AFX_EXT_CLASS FUGEN //导出类
{
 public:
  FUGEN();
  ~FUGEN();
//辅助函数
 private:

  //1获得记录个数
  int GetCounts();

  //2确认端口
  BOOL ConfigureComPort();

  //3在库中查询表号,存在返回序号; 并将所有表号存入m_allCode;
  int SearchAndGet(char * meterCode);
    
//功能函数
 public:  

  //1连接
  int connect (struct commArg* ca);

  //2断开
  int close (char* com);

  //3抄表号(某一个集中器所包含的集抄电表的表号)
  int meterCode (pchVct* rtn, char* jzq);

  //4点名实时抄表(集中器上的某一个电表的读数)
  int realTimeMeter (dlValue* rtn,char* jzq,char* meterCode);

  //5连续抄表(连续抄出当时或与当时最近的冻结电量)
  int continueMeter (structVctDL* rtn,char* jzq, pchVct* metercodeset);

  //6每月上报日电量(每月给电力营销系统的上报电量)
  int freezeValue (structVctDL* rtn,char* jzq, pchVct* metercodeset);

  //7抄集中器基本参数(电表个数、集中器时间、上报日等基本参数)
  int centerArg (struct centerParam* rtn,char* jzq);

  //8广播校时
  int publicTime (char* jzq);

  //9设置每月上报日
  int freezeTime (char* jzq,char* freezeIt);

  //10时段费率设置(峰、谷、尖、平四个时段的设置)
  int feeRate (char* jzq, structVctFeeRate* argFeeRate);

  //11增加表号
  int addMeterCode (char* jzq,char* meterNum);

  //12修改表号
  int modifyMeterCode (char* jzq, char* oldNum, char* newNum);

  //13删除表号
  int delMeterCode (char* jzq, char* meterNum);

 private:
  CSerialPort*  m_pComm;//端口
  pchVct m_allCode;
  int retW;
  int retR;
  int commandLen;
  char command[256];
  char respond[256];  
};

// SerialPort.h: interface for the CSerialPort class.
//
//
#ifndef _MY_SERIAL_PORT_H_
#define _MY_SERIAL_PORT_H_

class AFX_EXT_CLASS CSerialPort
{
public:
 CSerialPort();
 virtual ~CSerialPort();

public:
 BOOL OpenPort(TCHAR* strPort, int nBaud);
 VOID ClosePort();  
 int  InBufferCount(VOID);
 DWORD ReadBytes(PBYTE buffer, DWORD dwByteRead);
 DWORD WriteBytes(const char * buffer, DWORD dwByteWrite);
 
public:
 BOOL   m_bOpened;
 HANDLE   m_hCommDev;   //设备控制块结构
};

#endif //_MY_SERIAL_PORT_H_

 

/*====================================================================================================== =======================================================================================================*/ /*======================================================================================================== 如何使用? 1.引入DLL文件,引入头本文件,就已声明了导入函数 //要引入DLL的方法 //1、把SERIALPORTDLL1.dllSERIALPORTDLL1.lib拷贝到工程目录下 //2、然后在 工程->设置->连接->分类->常规->对象/库模块输入:SERIALPORTDLL1.lib 2.调用Init初始化串口 3.调用SetReceiveFuntion(&ReveveChar);指定接收和处理数据的函数 4.实现void ReveveChar(WPARAM data, LPARAM port)这个函数 5.调用SendData发送数据 6.ClosePort(); ========================================================================================================*/ /*======================================================================================================= 函 数 名: Init 功 能: 打开并初始化串口 参数说明: UINT port //端口号 UINT baud //波特率 char parity = 'N' //校验位,默认为无校验位 UINT databits = 8 //数据位,一个字节的位数,默认为8位 UINT stopbit = 1 //停止位,默认为1位 使用例子: Init(2,9600); //打开串口2,波特率9600,其它值为默认值(无奇偶校验、数据位为8、停止位为1) Init(4,4800,'N',10);//打开串口4,波特率为4800,无奇偶校验,数据位为10,(停止位默认为1) ... ... ======================================================================================================*/ extern "C" __declspec(dllimport) void Init( UINT port, //端口号 UINT baud, //波特率 char parity = 'N', //校验位 UINT databits=8 , //数据位 UINT stopbit=1 //停止位 ); /*========================================================================================================== 函 数 名: SendData 功 能: 向串口发送数据,使用之前必须先调用Init函数初始化串口 参数说明: char data[] //要发送的数据 int datalen //发送数据的长度 使用例子: 例1: char a[] = {0x01,0x03,0x00,0x03,0x00,0x02,0x34,0x0B};//准备要发送的十六进制:01 03 00 03 00 02 34 0B SendData(a,8); //向串口发送十六进制数:01 03 00 03 00 02 34 0B 例2: char a[] = "$01001000020110*" //准备要发送的字符串$01001000020110* SendData(a,16); //向串口发送:$01001000020110* ============================================================================================================*/ extern "C" __declspec(dllimport) void SendData( char data[], int datalen ); /*=================================================================================================================== 函 数 名: SetReceiveFuntion 功 能: 指定接收数据的函数,指定好后,串口接收缓冲区每有一个字节的数据时会自动触发和调用所指定的函数 参数说明: a、参数需要一个函数指针, b、该指针指向一个用于接收数据的函数(该函数由用户自己声明、定义和实现), c、用户定义该函数时必须要满足一下条件: 1、该函数为全局函数 2、返回值为void 3、形参为两个,类型为:形参为UINT,LONG 使用例子: 1、void ReveveChar(WPARAM data, LPARAM port);//声明一个用于接收数据的全局函数,本头文件已默认声明这个函数,用户无需再次声明 2、 CString strTemp; void ReveveChar(WPARAM data, LPARAM port)//实现这个接收数据并处理数据的函数 { static int RecevCount = 0; //用于接收字节数的计数 char str[512] = ""; sprintf(str,"%02x",data); //接收十六进制数,并格式化为字符形式 strTemp += str; RecevCount++; if (RecevCount >= 8) //接收到数据长度等于了协议长度,则开始进行协议的处理 { RecevCount = 0; strTemp = "接收到得数据协议为" + strTemp; AfxMessageBox(strTemp); strTemp = ""; } } 3、SetReceiveFuntion(&ReveveChar);//指定void ReveveChar(WPARAM data, LPARAM port);该函数接收和处理数据 =========================================================================================================================*/ extern "C" __declspec(dllimport) void SetReceiveFuntion(void (*pfCallBack)(WPARAM data, LPARAM port)); /*================================================= 函 数 名: ClosePort 功 能: 关闭由Init函数打开的串口 参数说明: 无需参数 调用例子: ClosePort(); =================================================*/ extern "C" __declspec(dllimport) void ClosePort(); /*=============================================================================================================== 函 数 名: ReveveChar 功 能: 每当串口接收到一个字符(字节)时就会自动触发和调用这个函数, 用户只需实现不必也不能去亲自调用, 注意:打开串口后,必须要调用SetReceiveFuntion(ReveveChar) 参数说明: data //接收到的是串口中的一个字节数据 port //端口号,表明是哪个端口接收到的数据 调用例子: 只要实现,无需自己调用。 实现处理数据可参考如下简单的例子,思想是边接收数据边处理 void ReveveChar(WPARAM data, LPARAM port) { static int RecevCount = 0; //用于接收字节数的计数 char str[512] = ""; sprintf(str,"%02x",data); //接收十六进制数,并格式化为字符形式 strTemp += str; RecevCount++; if (RecevCount >= 8) //接收到数据长度等于了协议长度,则开始进行协议的处理 { RecevCount = 0; strTemp = "接收到得数据协议为" + strTemp; AfxMessageBox(strTemp); strTemp = ""; } } 说明:本函数并非为导出函数,写在这里仅仅是起到声明一个函数的作用,用户也可以删除掉,自己声明和实现! ===============================================================================================================*/ void ReveveChar(WPARAM data, LPARAM port);
/*=============================================================================================================================================================================================================*/ /*======================================================================================================== 如何使用? 1.引入DLL文件,引入头本文件,就已声明了导入函数 //要引入DLL的方法 //1、把SERIALPORTDLL1.dllSERIALPORTDLL1.lib拷贝到工程目录下 //2、然后在 工程->设置->连接->分类->常规->对象/库模块输入:SERIALPORTDLL1.lib 2.调用Init初始化串口 3.调用SetReceiveFuntion(&ReveveChar);指定接收和处理数据的函数 4.实现void ReveveChar(WPARAM data, LPARAM port)这个函数 5.调用SendData发送数据 6.ClosePort(); ========================================================================================================*/ /*======================================================================================================= 函 数 名: Init 功 能: 打开并初始化串口 参数说明: UINT port //端口号 UINT baud //波特率 char parity = 'N' //校验位,默认为无校验位 UINT databits = 8 //数据位,一个字节的位数,默认为8位 UINT stopbit = 1 //停止位,默认为1位 使用例子: Init(2,9600); //打开串口2,波特率9600,其它值为默认值(无奇偶校验、数据位为8、停止位为1) Init(4,4800,'N',10);//打开串口4,波特率为4800,无奇偶校验,数据位为10,(停止位默认为1) ... ... ======================================================================================================*/ extern "C" __declspec(dllimport) void Init( UINT port, //端口号 UINT baud, //波特率 char parity = 'N', //校验位 UINT databits=8 , //数据位 UINT stopbit=1 //停止位 ); /*========================================================================================================== 函 数 名: SendData 功 能: 向串口发送数据,使用之前必须先调用Init函数初始化串口 参数说明: char data[] //要发送的数据 int datalen //发送数据的长度 使用例子: 例1: char a[] = {0x01,0x03,0x00,0x03,0x00,0x02,0x34,0x0B};//准备要发送的十六进制:01 03 00 03 00 02 34 0B SendData(a,8); //向串口发送十六进制数:01 03 00 03 00 02 34 0B 例2: char a[] = "$01001000020110*" //准备要发送的字符串$01001000020110* SendData(a,16); //向串口发送:$01001000020110* ============================================================================================================*/ extern "C" __declspec(dllimport) void SendData( char data[], int datalen ); /*=================================================================================================================== 函 数 名: SetReceiveFuntion 功 能: 指定接收数据的函数,指定好后,串口接收缓冲区每有一个字节的数据时会自动触发和调用所指定的函数 参数说明: a、参数需要一个函数指针, b、该指针指向一个用于接收数据的函数(该函数由用户自己声明、定义和实现), c、用户定义该函数时必须要满足一下条件: 1、该函数为全局函数 2、返回值为void 3、形参为两个,类型为:形参为UINT,LONG 使用例子: 1、void ReveveChar(WPARAM data, LPARAM port);//声明一个用于接收数据的全局函数,本头文件已默认声明这个函数,用户无需再次声明 2、 CString strTemp; void ReveveChar(WPARAM data, LPARAM port)//实现这个接收数据并处理数据的函数 { static int RecevCount = 0; //用于接收字节数的计数 char str[512] = ""; sprintf(str,"%02x",data); //接收十六进制数,并格式化为字符形式 strTemp += str; RecevCount++; if (RecevCount >= 8) //接收到数据长度等于了协议长度,则开始进行协议的处理 { RecevCount = 0; strTemp = "接收到得数据协议为" + strTemp; AfxMessageBox(strTemp); strTemp = ""; } } 3、SetReceiveFuntion(&ReveveChar);//指定void ReveveChar(WPARAM data, LPARAM port);该函数接收和处理数据 =========================================================================================================================*/ extern "C" __declspec(dllimport) void SetReceiveFuntion(void (*pfCallBack)(WPARAM data, LPARAM port)); /*================================================= 函 数 名: ClosePort 功 能: 关闭由Init函数打开的串口 参数说明: 无需参数 调用例子: ClosePort(); =================================================*/ extern "C" __declspec(dllimport) void ClosePort(); /*=============================================================================================================== 函 数 名: ReveveChar 功 能: 每当串口接收到一个字符(字节)时就会自动触发和调用这个函数, 用户只需实现不必也不能去亲自调用, 注意:打开串口后,必须要调用SetReceiveFuntion(ReveveChar) 参数说明: data //接收到的是串口中的一个字节数据 port //端口号,表明是哪个端口接收到的数据 调用例子: 只要实现,无需自己调用。 实现处理数据可参考如下简单的例子,思想是边接收数据边处理 void ReveveChar(WPARAM data, LPARAM port) { static int RecevCount = 0; //用于接收字节数的计数 char str[512] = ""; sprintf(str,"%02x",data); //接收十六进制数,并格式化为字符形式 strTemp += str; RecevCount++; if (RecevCount >= 8) //接收到数据长度等于了协议长度,则开始进行协议的处理 { RecevCount = 0; strTemp = "接收到得数据协议为" + strTemp; AfxMessageBox(strTemp); strTemp = ""; } } 说明:本函数并非为导出函数,写在这里仅仅是起到声明一个函数的作用,用户也可以删除掉,自己声明和实现! ===============================================================================================================*/ void ReveveChar(WPARAM data, LPARAM port);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值