// MostDevice.cpp : 定义 DLL 的初始化例程。 // #include "stdafx.h" #include "MostDevice.h" #include "CommFactory.h" #include ".\mostdevice.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CMostDeviceApp BEGIN_MESSAGE_MAP(CMostDeviceApp, CWinApp) END_MESSAGE_MAP() // CMostDeviceApp 构造 CMostDeviceApp::CMostDeviceApp() { // TODO: 在此处添加构造代码, // 将所有重要的初始化放置在 InitInstance 中 } // 唯一的一个 CMostDeviceApp 对象 CMostDeviceApp theApp; //CCommFactory *g_pObjCommFactory = NULL; typedef struct __COMM_FACTORY { CCommFactory *pObjCommFactory; int nCommPort; char szIniName[MAX_PATH]; // 配置文件名称 }CommFactory; CommFactory g_tagCommFactory[MAX_DEVICE_NUM];//结构数组; // CMostDeviceApp 初始化 BOOL CMostDeviceApp::InitInstance() { CWinApp::InitInstance(); //清空所有的串口句柄 ; for( int i = 0; i < MAX_DEVICE_NUM; i++ ) { g_tagCommFactory[i].pObjCommFactory = NULL; g_tagCommFactory[i].nCommPort = 0; memset( g_tagCommFactory[i].szIniName, 0, sizeof(g_tagCommFactory[i].szIniName) ); } return TRUE; } int CMostDeviceApp::ExitInstance() { // TODO: 在此添加专用代码和/或调用基类 //LOG4C((LOG_NOTICE , "ExitInstance退出")); return CWinApp::ExitInstance(); } int GetCommFactoryIndex(int nCommPort, char szIniName[MAX_PATH]) { int nIndex = -1; for( int i = 0; i < MAX_DEVICE_NUM; i++ ) { if( strcmp(g_tagCommFactory[i].szIniName, szIniName) == 0 && nCommPort == g_tagCommFactory[i].nCommPort) { nIndex = i;//查找此串口设备,找到返回当前位置 //LOG4C((LOG_NOTICE , "返回串口在数组中的位置 : %d",i)); } } return nIndex; } int GetCommFactoryMaxIndex() { int nIndex = -1; for( int i = 0; i < MAX_DEVICE_NUM; i++ ) { if( strcmp(g_tagCommFactory[i].szIniName, "") == 0 && g_tagCommFactory[i].nCommPort == 0 ) { nIndex = i;//查找一个空的串口0 设备,并返回当前位置 break; } } return nIndex; } // 大写转换成小写 int StrLower(char *pSource, char *pDest) { int length, i; length = (int)strlen(pSource); for (i = 0; i < length; i++) { if ((pSource[i] >= 'A') && (pSource[i] <= 'Z')) { pDest[i] = _tolower(pSource[i]); } else pDest[i] = pSource[i]; } return 0; } BOOL DLL_MostDeviceInit( char szPath[MAX_PATH], // 程序所在路径 char szIniName[MAX_PATH], // 配置文件名称 int nCommPort, // 串行端口 int nAddr, // 设备地址 int nRate, // 波特率 int nDataBit, // 数据位 int nStopBit, // 停止位 int nParity, // 校验位 int nInterval // 时间间隔 ) { //LOG4C((LOG_NOTICE,"DLL_MostDeviceInit szIniName = %s, nCommPort = %d ,nAddr = %d, nRate = %d",szIniName,nCommPort,nAddr,nRate)); BOOL bResult = FALSE; int nIndex = GetCommFactoryIndex(nCommPort, szIniName); //获取串口信息,如果返回-1(没有此串口设备) //返回-1,没有此设备,重新添加到生产类集合中; if( nIndex == -1 ) { //返回当前空口串口0 设备位置,将当前的设备打入 nIndex = GetCommFactoryMaxIndex(); strcpy(g_tagCommFactory[nIndex].szIniName, szIniName); g_tagCommFactory[nIndex].nCommPort = nCommPort; if( g_tagCommFactory[nIndex].pObjCommFactory == NULL ) { g_tagCommFactory[nIndex].pObjCommFactory = new CCommFactory(); //新建串口句柄; //新建串句柄,打开串口 //LOG4C((LOG_NOTICE, "新建串句柄,打开串口")); bResult = g_tagCommFactory[nIndex].pObjCommFactory->CreateDeviceCommunication( szPath, szIniName, nCommPort, nAddr, nRate, nDataBit, nStopBit, nParity, nInterval ); if( FALSE == bResult )//打开串口失败,从队列中删除 { LOG4C((LOG_NOTICE , "打开串口失败,从队列中删除")); delete g_tagCommFactory[nIndex].pObjCommFactory; g_tagCommFactory[nIndex].pObjCommFactory = NULL; g_tagCommFactory[nIndex].nCommPort = 0; memset(g_tagCommFactory[nIndex].szIniName, 0, sizeof(g_tagCommFactory[nIndex].szIniName)); } } } else //该串口句柄存在; { if( g_tagCommFactory[nIndex].pObjCommFactory ) { bResult = TRUE; } } return bResult; } //退出线程,销毁串口句柄; void DLL_MostDeviceUnInit( char szPath[MAX_PATH], // 程序所在路径 char szIniName[MAX_PATH], // 配置文件名称 int nCommPort // 串行端口 ) { //查找(获取)当前串口,获取当前串口位置 int nIndex = GetCommFactoryIndex(nCommPort, szIniName); if( nIndex == -1 ) return; //删除串口句柄; if( g_tagCommFactory[nIndex].pObjCommFactory != NULL ) { g_tagCommFactory[nIndex].pObjCommFactory->DestroyDeviceCommnication(szPath, szIniName, nCommPort); delete g_tagCommFactory[nIndex].pObjCommFactory; g_tagCommFactory[nIndex].pObjCommFactory = NULL; } } int DLL_MostDeviceRead( char szPath[MAX_PATH], // 程序所在路径 char szIniName[MAX_PATH], // 配置文件名称 int nCommPort, // 串行端口 int nAddr, // 设备地址 char szCmd[MAX_CMD], // 请求命令 char szMsg[VAR_MSG], // 响应的值 int nReversed1, // 预留整形参数1接口 int nReversed2, // 预留整形参数2接口 int nReversed3, // 预留整形参数3接口 int nReversed4, // 预留整形参数4接口 int nReversed5, // 预留整形参数5接口 float fReversed1, // 预留float参数1接口 float fReversed2, // 预留float参数2接口 float fReversed3, // 预留float参数3接口 char szReversed1[MAX_RESERVED1], // 预留字符数组参数1接口 char szReversed2[MAX_RESERVED2], // 预留字符数组参数2接口 char szReversed3[MAX_RESERVED3], // 预留字符数组参数3接口 char szReversed4[MAX_RESERVED4], // 预留字符数组参数4接口 char szReversed5[MAX_RESERVED5] // 预留字符数组参数5接口 ) { //LOG4C((LOG_NOTICE, "DLL_MostDeviceRead szPath = %s,szIniName = %s , nCommPort = %d", szPath, szIniName ,nCommPort)); char szTmpIniName[MAX_PATH] = {0}; StrLower(szIniName,szTmpIniName); int nRet = -1; int nIndex = GetCommFactoryIndex(nCommPort, szIniName);//读取操作时,先判断是哪个串口句柄; if( nIndex == -1 ) { LOG4C((LOG_NOTICE,"串口位置为-1")); return nRet; } if( g_tagCommFactory[nIndex].pObjCommFactory )//相应串口句柄; { //LOG4C((LOG_NOTICE, "读接口!")); nRet = g_tagCommFactory[nIndex].pObjCommFactory->SendReadRequest( szPath, szIniName, nCommPort, nAddr, szCmd, szMsg, nReversed1, nReversed2, nReversed3, nReversed4, nReversed5, fReversed1, fReversed2, fReversed3, szReversed1, szReversed2, szReversed3, szReversed4, szReversed5 ); } return nRet; } int DLL_MostDeviceSet( char szPath[MAX_PATH], // 程序所在路径 char szIniName[MAX_PATH], // 配置文件名称 int nCommPort, // 串行端口 int nAddr, // 设备地址 char szCmd[MAX_CMD], // 请求命令 char szMsg[VAR_MSG], // 写入设备里的值 int nReversed1, // 预留整形参数1接口 int nReversed2, // 预留整形参数2接口 int nReversed3, // 预留整形参数3接口 int nReversed4, // 预留整形参数4接口 int nReversed5, // 预留整形参数5接口 float fReversed1, // 预留float参数1接口 float fReversed2, // 预留float参数2接口 float fReversed3, // 预留float参数3接口 char szReversed1[MAX_RESERVED1], // 预留字符数组参数1接口 char szReversed2[MAX_RESERVED2], // 预留字符数组参数2接口 char szReversed3[MAX_RESERVED3], // 预留字符数组参数3接口 char szReversed4[MAX_RESERVED4], // 预留字符数组参数4接口 char szReversed5[MAX_RESERVED5] // 预留字符数组参数5接口 ) { //LOG4C((LOG_NOTICE , "DLL_MostDeviceSet")); char szTmpIniName[MAX_PATH] = {0}; StrLower(szIniName,szTmpIniName); int nRet = -1; int nIndex = GetCommFactoryIndex(nCommPort, szIniName);//写操作之前,判断串口句柄; if( nIndex == -1 ) return nRet; if( g_tagCommFactory[nIndex].pObjCommFactory )//相应串口句柄; { nRet = g_tagCommFactory[nIndex].pObjCommFactory->SendSetReuest( szPath, szIniName, nCommPort, nAddr, szCmd, szMsg, nReversed1, nReversed2, nReversed3, nReversed4, nReversed5, fReversed1, fReversed2, fReversed3, szReversed1, szReversed2, szReversed3, szReversed4, szReversed5 ); } return nRet; }