// 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 SERIALSCF_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 // SERIALSCF_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的 // 符号视为是被导出的。 #ifndef SERIALSCF_EXPORTS #ifdef _WIN64 #ifdef _DEBUG #pragma comment (lib, "Dios.Dev.SerialSCFX64D.lib") #else #pragma comment (lib, "Dios.Dev.SerialSCFX64.lib") #endif #else #ifdef _DEBUG #pragma comment (lib, "Dios.Dev.SerialSCFD.lib") #else #pragma comment (lib, "Dios.Dev.SerialSCF.lib") #endif #endif #endif #ifdef SERIALSCF_EXPORTS #define SERIALSCF_API __declspec (dllexport) #define SERIALSCF_C_API extern "C" __declspec (dllexport) #else #define SERIALSCF_API __declspec (dllimport) #define SERIALSCF_C_API extern "C" __declspec (dllimport) #endif #include "SCF.Detail.h" #include "ResDataObject.h" namespace eSCF = DIOS::Dev::Communication::Detail; SERIALSCF_C_API eSCF::SCFDetail * CreateSCF (); namespace DIOS { namespace Dev { namespace Communication { namespace Detail { // 此类是从 SerialSCF.dll 导出的 class SERIALSCF_API SerialSCF : public eSCF::SCFDetail { using super = eSCF::SCFDetail; HANDLE hCom; OVERLAPPED m_osRead; OVERLAPPED m_osWrite; string m_PortName; DWORD m_BaudRate; DWORD m_ByteSize; DWORD m_Parity; DWORD m_StopBits; DWORD m_ReadTimeout; DWORD m_WriteTimeout; int ConnectCOM (const char *pCom, DWORD BaudRate, DWORD ByteSize, DWORD Parity, DWORD StopBits); public: SerialSCF (void); virtual ~SerialSCF (); //设置连接,参数也由json传过来 /* { "connect":"COM", "port":"COM1", "baudrate":"3200", "bytesize":"8", "parity":"1", "stopbits":"1", } */ int Connect (ResDataObject & Connectprameters, tPacketPredate callback = nullptr, SCF_TRANSFERTYPE TransferType = SCF_NORMAL_TRANSFER, DWORD msTimeOut = 0) override; //断开连接 void Disconnect () override; //判断是否连接 bool isConnected () const override; const char* GetConnectionType (); //将数据包通过SCF进行发送 int SendPacket (const char *pPacket, DWORD length, DWORD timeout); int SendPacket (SCFPacket *pPacket, DWORD timeout); protected: //继承类的读包流程,直接从SCF接口中读取数据,通常由SCF的读取线程调用,当上层直接调用的时候需要锁住读取线程,再调用该函数 int ReadData (char *pPacket, DWORD length, DWORD timeout); //int ReadData (SCFPacket *pPacket, DWORD timeout); }; } } } }