parent
207273236d
commit
32b27345d6
@ -1 +1,5 @@
|
||||
Project/Objects
|
||||
Window Tool/TimeSet/.vs/TimeSet/v15/ipch
|
||||
*.db
|
||||
*.zip
|
||||
Window Tool/TimeSet/TimeSet/Debug
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,367 @@
|
||||
// Serial.h - Definition of the CSerial class
|
||||
//
|
||||
// Copyright (C) 1999-2003 Ramon de Klein (Ramon.de.Klein@ict.nl)
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
|
||||
#ifndef __SERIAL_H
|
||||
#define __SERIAL_H
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// The SERIAL_DEFAULT_OVERLAPPED defines if the default open mode uses
|
||||
// overlapped I/O. When overlapped I/O is available (normal Win32
|
||||
// platforms) it uses overlapped I/O. Windows CE doesn't allow the use
|
||||
// of overlapped I/O, so it is disabled there by default.
|
||||
|
||||
#ifndef SERIAL_DEFAULT_OVERLAPPED
|
||||
#ifndef SERIAL_NO_OVERLAPPED
|
||||
#define SERIAL_DEFAULT_OVERLAPPED true
|
||||
#else
|
||||
#define SERIAL_DEFAULT_OVERLAPPED false
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// CSerial - Win32 wrapper for serial communications
|
||||
//
|
||||
// Serial communication often causes a lot of problems. This class
|
||||
// tries to supply an easy to use interface to deal with serial
|
||||
// devices.
|
||||
//
|
||||
// The class is actually pretty ease to use. You only need to open
|
||||
// the COM-port, where you need to specify the basic serial
|
||||
// communication parameters. You can also choose to setup handshaking
|
||||
// and read timeout behaviour.
|
||||
//
|
||||
// The following serial classes are available:
|
||||
//
|
||||
// CSerial - Serial communication support.
|
||||
// CSerialEx - Serial communication with listener thread for events
|
||||
// CSerialSync - Serial communication with synchronized event handler
|
||||
// CSerialWnd - Asynchronous serial support, which uses the Win32
|
||||
// message queue for event notification.
|
||||
// CSerialMFC - Preferred class to use in MFC-based GUI windows.
|
||||
//
|
||||
//
|
||||
// Pros:
|
||||
// -----
|
||||
// - Easy to use (hides a lot of nasty Win32 stuff)
|
||||
// - Fully ANSI and Unicode aware
|
||||
//
|
||||
// Cons:
|
||||
// -----
|
||||
// - Little less flexibility then native Win32 API, however you can
|
||||
// use this API at the same time for features which are missing
|
||||
// from this class.
|
||||
// - Incompatible with Windows 95 or Windows NT v3.51 (or earlier),
|
||||
// because CancelIo isn't support on these platforms. Define the
|
||||
// SERIAL_NO_CANCELIO macro for support of these platforms as
|
||||
// well. When this macro is defined, then only time-out values of
|
||||
// 0 or INFINITE are valid.
|
||||
//
|
||||
//
|
||||
// Copyright (C) 1999-2003 Ramon de Klein
|
||||
// (Ramon.de.Klein@ict.nl)
|
||||
|
||||
class CSerial
|
||||
{
|
||||
// Class enumerations
|
||||
public:
|
||||
// Communication event
|
||||
typedef enum
|
||||
{
|
||||
EEventUnknown = -1, // Unknown event
|
||||
EEventNone = 0, // Event trigged without cause
|
||||
EEventBreak = EV_BREAK, // A break was detected on input
|
||||
EEventCTS = EV_CTS, // The CTS signal changed state
|
||||
EEventDSR = EV_DSR, // The DSR signal changed state
|
||||
EEventError = EV_ERR, // A line-status error occurred
|
||||
EEventRing = EV_RING, // A ring indicator was detected
|
||||
EEventRLSD = EV_RLSD, // The RLSD signal changed state
|
||||
EEventRecv = EV_RXCHAR, // Data is received on input
|
||||
EEventRcvEv = EV_RXFLAG, // Event character was received on input
|
||||
EEventSend = EV_TXEMPTY, // Last character on output was sent
|
||||
EEventPrinterError = EV_PERR, // Printer error occured
|
||||
EEventRx80Full = EV_RX80FULL, // Receive buffer is 80 percent full
|
||||
EEventProviderEvt1 = EV_EVENT1, // Provider specific event 1
|
||||
EEventProviderEvt2 = EV_EVENT2, // Provider specific event 2
|
||||
}
|
||||
EEvent;
|
||||
|
||||
// Baudrate
|
||||
typedef enum
|
||||
{
|
||||
EBaudUnknown = -1, // Unknown
|
||||
EBaud110 = CBR_110, // 110 bits/sec
|
||||
EBaud300 = CBR_300, // 300 bits/sec
|
||||
EBaud600 = CBR_600, // 600 bits/sec
|
||||
EBaud1200 = CBR_1200, // 1200 bits/sec
|
||||
EBaud2400 = CBR_2400, // 2400 bits/sec
|
||||
EBaud4800 = CBR_4800, // 4800 bits/sec
|
||||
EBaud9600 = CBR_9600, // 9600 bits/sec
|
||||
EBaud14400 = CBR_14400, // 14400 bits/sec
|
||||
EBaud19200 = CBR_19200, // 19200 bits/sec (default)
|
||||
EBaud38400 = CBR_38400, // 38400 bits/sec
|
||||
EBaud56000 = CBR_56000, // 56000 bits/sec
|
||||
EBaud57600 = CBR_57600, // 57600 bits/sec
|
||||
EBaud115200 = CBR_115200, // 115200 bits/sec
|
||||
EBaud128000 = CBR_128000, // 128000 bits/sec
|
||||
EBaud256000 = CBR_256000, // 256000 bits/sec
|
||||
}
|
||||
EBaudrate;
|
||||
|
||||
// Data bits (5-8)
|
||||
typedef enum
|
||||
{
|
||||
EDataUnknown = -1, // Unknown
|
||||
EData5 = 5, // 5 bits per byte
|
||||
EData6 = 6, // 6 bits per byte
|
||||
EData7 = 7, // 7 bits per byte
|
||||
EData8 = 8 // 8 bits per byte (default)
|
||||
}
|
||||
EDataBits;
|
||||
|
||||
// Parity scheme
|
||||
typedef enum
|
||||
{
|
||||
EParUnknown = -1, // Unknown
|
||||
EParNone = NOPARITY, // No parity (default)
|
||||
EParOdd = ODDPARITY, // Odd parity
|
||||
EParEven = EVENPARITY, // Even parity
|
||||
EParMark = MARKPARITY, // Mark parity
|
||||
EParSpace = SPACEPARITY // Space parity
|
||||
}
|
||||
EParity;
|
||||
|
||||
// Stop bits
|
||||
typedef enum
|
||||
{
|
||||
EStopUnknown = -1, // Unknown
|
||||
EStop1 = ONESTOPBIT, // 1 stopbit (default)
|
||||
EStop1_5 = ONE5STOPBITS,// 1.5 stopbit
|
||||
EStop2 = TWOSTOPBITS // 2 stopbits
|
||||
}
|
||||
EStopBits;
|
||||
|
||||
// Handshaking
|
||||
typedef enum
|
||||
{
|
||||
EHandshakeUnknown = -1, // Unknown
|
||||
EHandshakeOff = 0, // No handshaking
|
||||
EHandshakeHardware = 1, // Hardware handshaking (RTS/CTS)
|
||||
EHandshakeSoftware = 2 // Software handshaking (XON/XOFF)
|
||||
}
|
||||
EHandshake;
|
||||
|
||||
// Timeout settings
|
||||
typedef enum
|
||||
{
|
||||
EReadTimeoutUnknown = -1, // Unknown
|
||||
EReadTimeoutNonblocking = 0, // Always return immediately
|
||||
EReadTimeoutBlocking = 1 // Block until everything is retrieved
|
||||
}
|
||||
EReadTimeout;
|
||||
|
||||
// Communication errors
|
||||
typedef enum
|
||||
{
|
||||
EErrorUnknown = 0, // Unknown
|
||||
EErrorBreak = CE_BREAK, // Break condition detected
|
||||
EErrorFrame = CE_FRAME, // Framing error
|
||||
EErrorIOE = CE_IOE, // I/O device error
|
||||
EErrorMode = CE_MODE, // Unsupported mode
|
||||
EErrorOverrun = CE_OVERRUN, // Character buffer overrun, next byte is lost
|
||||
EErrorRxOver = CE_RXOVER, // Input buffer overflow, byte lost
|
||||
EErrorParity = CE_RXPARITY,// Input parity error
|
||||
EErrorTxFull = CE_TXFULL // Output buffer full
|
||||
}
|
||||
EError;
|
||||
|
||||
// Port availability
|
||||
typedef enum
|
||||
{
|
||||
EPortUnknownError = -1, // Unknown error occurred
|
||||
EPortAvailable = 0, // Port is available
|
||||
EPortNotAvailable = 1, // Port is not present
|
||||
EPortInUse = 2 // Port is in use
|
||||
|
||||
}
|
||||
EPort;
|
||||
|
||||
// Construction
|
||||
public:
|
||||
CSerial();
|
||||
virtual ~CSerial();
|
||||
|
||||
// Operations
|
||||
public:
|
||||
// Check if particular COM-port is available (static method).
|
||||
static EPort CheckPort (LPCTSTR lpszDevice);
|
||||
|
||||
// Open the serial communications for a particular COM port. You
|
||||
// need to use the full devicename (i.e. "COM1") to open the port.
|
||||
// It's possible to specify the size of the input/output queues.
|
||||
virtual LONG Open (LPCTSTR lpszDevice, DWORD dwInQueue = 0, DWORD dwOutQueue = 0, bool fOverlapped = SERIAL_DEFAULT_OVERLAPPED);
|
||||
|
||||
// Close the serial port.
|
||||
virtual LONG Close (void);
|
||||
|
||||
// Setup the communication settings such as baudrate, databits,
|
||||
// parity and stopbits. The default settings are applied when the
|
||||
// device has been opened. Call this function if these settings do
|
||||
// not apply for your application. If you prefer to use integers
|
||||
// instead of the enumerated types then just cast the integer to
|
||||
// the required type. So the following two initializations are
|
||||
// equivalent:
|
||||
//
|
||||
// Setup(EBaud9600,EData8,EParNone,EStop1)
|
||||
//
|
||||
// or
|
||||
//
|
||||
// Setup(EBaudrate(9600),EDataBits(8),EParity(NOPARITY),EStopBits(ONESTOPBIT))
|
||||
//
|
||||
// In the latter case, the types are not validated. So make sure
|
||||
// that you specify the appropriate values.
|
||||
virtual LONG Setup (EBaudrate eBaudrate = EBaud9600,
|
||||
EDataBits eDataBits = EData8,
|
||||
EParity eParity = EParNone,
|
||||
EStopBits eStopBits = EStop1);
|
||||
|
||||
// Set/clear the event character. When this byte is being received
|
||||
// on the serial port then the EEventRcvEv event is signalled,
|
||||
// when the mask has been set appropriately. If the fAdjustMask flag
|
||||
// has been set, then the event mask is automatically adjusted.
|
||||
virtual LONG SetEventChar (BYTE bEventChar, bool fAdjustMask = true);
|
||||
|
||||
// Set the event mask, which indicates what events should be
|
||||
// monitored. The WaitEvent method can only monitor events that
|
||||
// have been enabled. The default setting only monitors the
|
||||
// error events and data events. An application may choose to
|
||||
// monitor CTS. DSR, RLSD, etc as well.
|
||||
virtual LONG SetMask (DWORD dwMask = EEventBreak|EEventError|EEventRecv);
|
||||
|
||||
// The WaitEvent method waits for one of the events that are
|
||||
// enabled (see SetMask).
|
||||
virtual LONG WaitEvent (LPOVERLAPPED lpOverlapped = 0, DWORD dwTimeout = INFINITE);
|
||||
|
||||
// Setup the handshaking protocol. There are three forms of
|
||||
// handshaking:
|
||||
//
|
||||
// 1) No handshaking, so data is always send even if the receiver
|
||||
// cannot handle the data anymore. This can lead to data loss,
|
||||
// when the sender is able to transmit data faster then the
|
||||
// receiver can handle.
|
||||
// 2) Hardware handshaking, where the RTS/CTS lines are used to
|
||||
// indicate if data can be sent. This mode requires that both
|
||||
// ports and the cable support hardware handshaking. Hardware
|
||||
// handshaking is the most reliable and efficient form of
|
||||
// handshaking available, but is hardware dependant.
|
||||
// 3) Software handshaking, where the XON/XOFF characters are used
|
||||
// to throttle the data. A major drawback of this method is that
|
||||
// these characters cannot be used for data anymore.
|
||||
virtual LONG SetupHandshaking (EHandshake eHandshake);
|
||||
|
||||
// Read operations can be blocking or non-blocking. You can use
|
||||
// this method to setup wether to use blocking or non-blocking
|
||||
// reads. Non-blocking reads is the default, which is required
|
||||
// for most applications.
|
||||
//
|
||||
// 1) Blocking reads, which will cause the 'Read' method to block
|
||||
// until the requested number of bytes have been read. This is
|
||||
// useful if you know how many data you will receive.
|
||||
// 2) Non-blocking reads, which will read as many bytes into your
|
||||
// buffer and returns almost immediately. This is often the
|
||||
// preferred setting.
|
||||
virtual LONG SetupReadTimeouts (EReadTimeout eReadTimeout);
|
||||
|
||||
// Obtain communication settings
|
||||
virtual EBaudrate GetBaudrate (void);
|
||||
virtual EDataBits GetDataBits (void);
|
||||
virtual EParity GetParity (void);
|
||||
virtual EStopBits GetStopBits (void);
|
||||
virtual EHandshake GetHandshaking (void);
|
||||
virtual DWORD GetEventMask (void);
|
||||
virtual BYTE GetEventChar (void);
|
||||
|
||||
// Write data to the serial port. Note that we are only able to
|
||||
// send ANSI strings, because it probably doesn't make sense to
|
||||
// transmit Unicode strings to an application.
|
||||
virtual LONG Write (const void* pData, size_t iLen, DWORD* pdwWritten = 0, LPOVERLAPPED lpOverlapped = 0, DWORD dwTimeout = INFINITE);
|
||||
virtual LONG Write (LPCSTR pString, DWORD* pdwWritten = 0, LPOVERLAPPED lpOverlapped = 0, DWORD dwTimeout = INFINITE);
|
||||
|
||||
// Read data from the serial port. Refer to the description of
|
||||
// the 'SetupReadTimeouts' for an explanation about (non) blocking
|
||||
// reads and how to use this.
|
||||
virtual LONG Read (void* pData, size_t iLen, DWORD* pdwRead = 0, LPOVERLAPPED lpOverlapped = 0, DWORD dwTimeout = INFINITE);
|
||||
|
||||
// Send a break
|
||||
LONG Break (void);
|
||||
|
||||
// Determine what caused the event to trigger
|
||||
EEvent GetEventType (void);
|
||||
|
||||
// Obtain the error
|
||||
EError GetError (void);
|
||||
|
||||
// Obtain the COMM and event handle
|
||||
HANDLE GetCommHandle (void) { return m_hFile; }
|
||||
|
||||
// Check if com-port is opened
|
||||
bool IsOpen (void) const { return (m_hFile != 0); }
|
||||
|
||||
// Obtain last error status
|
||||
LONG GetLastError (void) const { return m_lLastError; }
|
||||
|
||||
// Obtain CTS/DSR/RING/RLSD settings
|
||||
bool GetCTS (void);
|
||||
bool GetDSR (void);
|
||||
bool GetRing (void);
|
||||
bool GetRLSD (void);
|
||||
|
||||
// Purge all buffers
|
||||
LONG Purge (void);
|
||||
|
||||
protected:
|
||||
// Internal helper class which wraps DCB structure
|
||||
class CDCB : public DCB
|
||||
{
|
||||
public:
|
||||
CDCB() { DCBlength = sizeof(DCB); }
|
||||
};
|
||||
|
||||
// Attributes
|
||||
protected:
|
||||
LONG m_lLastError; // Last serial error
|
||||
HANDLE m_hFile; // File handle
|
||||
EEvent m_eEvent; // Event type
|
||||
DWORD m_dwEventMask; // Event mask
|
||||
|
||||
#ifndef SERIAL_NO_OVERLAPPED
|
||||
HANDLE m_hevtOverlapped; // Event handle for internal overlapped operations
|
||||
#endif
|
||||
|
||||
protected:
|
||||
// Check the requirements
|
||||
void CheckRequirements (LPOVERLAPPED lpOverlapped, DWORD dwTimeout) const;
|
||||
|
||||
// CancelIo wrapper (for Win95 compatibility)
|
||||
BOOL CancelCommIo (void);
|
||||
};
|
||||
|
||||
#endif // __SERIAL_H
|
@ -0,0 +1,277 @@
|
||||
// SerialEx.cpp - Implementation of the CSerialEx class
|
||||
//
|
||||
// Copyright (C) 1999-2003 Ramon de Klein (Ramon.de.Klein@ict.nl)
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Include the standard header files
|
||||
|
||||
|
||||
#include <crtdbg.h>
|
||||
#include <tchar.h>
|
||||
#include <windows.h>
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Include module headerfile
|
||||
#include "pch.h"
|
||||
#include "SerialEx.h"
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Disable warning C4127: conditional expression is constant, which
|
||||
// is generated when using the _RPTF and _ASSERTE macros.
|
||||
|
||||
#pragma warning(disable: 4127)
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Enable debug memory manager
|
||||
|
||||
#ifdef _DEBUG
|
||||
|
||||
#ifdef THIS_FILE
|
||||
#undef THIS_FILE
|
||||
#endif
|
||||
|
||||
static const char THIS_FILE[] = __FILE__;
|
||||
#define new DEBUG_NEW
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Code
|
||||
|
||||
CSerialEx::CSerialEx()
|
||||
: m_fStopping(false)
|
||||
, m_hThread(0)
|
||||
#ifndef SERIAL_NO_OVERLAPPED
|
||||
, m_hevtOverlappedWorkerThread(0)
|
||||
#endif
|
||||
{
|
||||
}
|
||||
|
||||
CSerialEx::~CSerialEx()
|
||||
{
|
||||
// Check if the thread handle is still there. If so, then we
|
||||
// didn't close the serial port. We cannot depend on the
|
||||
// CSerial destructor, because if it calls Close then it
|
||||
// won't call our overridden Close.
|
||||
if (m_hThread)
|
||||
{
|
||||
// Display a warning
|
||||
_RPTF0(_CRT_WARN, "CSerialEx::~CSerialEx - Serial port not closed\n");
|
||||
|
||||
// Close implicitly
|
||||
Close();
|
||||
}
|
||||
}
|
||||
|
||||
LONG CSerialEx::Open (LPCTSTR lpszDevice, DWORD dwInQueue, DWORD dwOutQueue, bool fStartListener)
|
||||
{
|
||||
// Call the base class first
|
||||
long lLastError = CSerial::Open(lpszDevice,dwInQueue,dwOutQueue,SERIAL_DEFAULT_OVERLAPPED);
|
||||
if (lLastError != ERROR_SUCCESS)
|
||||
return lLastError;
|
||||
|
||||
#ifndef SERIAL_NO_OVERLAPPED
|
||||
// Create an event that is used for the workerthread. The globally
|
||||
// used event is used by the main-thread and cannot be reused
|
||||
// for this thread.
|
||||
m_hevtOverlappedWorkerThread = ::CreateEvent(0,true,false,0);
|
||||
if (m_hevtOverlappedWorkerThread == 0)
|
||||
{
|
||||
// Obtain the error information
|
||||
m_lLastError = ::GetLastError();
|
||||
_RPTF0(_CRT_WARN,"CSerialEx::Open - Unable to create event\n");
|
||||
|
||||
// Close the serial port again
|
||||
CSerial::Close();
|
||||
|
||||
// Return the error
|
||||
return m_lLastError;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
// Start the listener thread (only on request)
|
||||
if (fStartListener)
|
||||
{
|
||||
lLastError = StartListener();
|
||||
if (lLastError != ERROR_SUCCESS)
|
||||
return lLastError;
|
||||
}
|
||||
|
||||
// Return the error
|
||||
return m_lLastError;
|
||||
}
|
||||
|
||||
LONG CSerialEx::Close (void)
|
||||
{
|
||||
// Stop listener thread (wait until it ends)
|
||||
//StopListener(INFINITE);
|
||||
StopListener(100);
|
||||
|
||||
#ifndef SERIAL_NO_OVERLAPPED
|
||||
// Free event handle
|
||||
if (m_hevtOverlappedWorkerThread)
|
||||
{
|
||||
::CloseHandle(m_hevtOverlappedWorkerThread);
|
||||
m_hevtOverlappedWorkerThread = 0;
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
// Call the base class
|
||||
return CSerial::Close();
|
||||
}
|
||||
|
||||
LONG CSerialEx::StartListener (void)
|
||||
{
|
||||
// Check if the watcher thread was already running
|
||||
if (m_hThread == 0)
|
||||
{
|
||||
// Make sure the thread has stopped
|
||||
_ASSERTE(!m_fStopping);
|
||||
|
||||
// Start the watcher thread
|
||||
DWORD dwThreadId = 0;
|
||||
m_hThread = ::CreateThread(0,0,ThreadProc,LPVOID(this),0,&dwThreadId);
|
||||
if (m_hThread == 0)
|
||||
{
|
||||
// Display a warning
|
||||
_RPTF0(_CRT_WARN, "CSerialEx::StartListener - Unable to start COMM watcher thread\n");
|
||||
|
||||
// Set the error code and exit
|
||||
m_lLastError = ::GetLastError();
|
||||
return m_lLastError;
|
||||
}
|
||||
}
|
||||
|
||||
// Return the error
|
||||
m_lLastError = ERROR_SUCCESS;
|
||||
return m_lLastError;
|
||||
}
|
||||
|
||||
LONG CSerialEx::StopListener (DWORD dwTimeout)
|
||||
{
|
||||
// Check if the thread is running
|
||||
if (m_hThread)
|
||||
{
|
||||
// Set the flag that the thread must be stopped
|
||||
m_fStopping = true;
|
||||
|
||||
// Cancel the pending WaitEvent, but we won't do this using
|
||||
// CancelIo. This would break Win95 compatibility and some
|
||||
// USB serial dongles cannot handle CancelIo correctly. By
|
||||
// setting the event mask again, the call will also be
|
||||
// completed before the thread exits.
|
||||
SetMask(GetEventMask());
|
||||
|
||||
// Wait until the watcher thread has stopped
|
||||
::WaitForSingleObject(m_hThread,dwTimeout);
|
||||
|
||||
// The thread has stopped
|
||||
m_fStopping = false;
|
||||
|
||||
// Close handle to the thread
|
||||
::CloseHandle(m_hThread);
|
||||
m_hThread = 0;
|
||||
}
|
||||
|
||||
// Return the error
|
||||
m_lLastError = ERROR_SUCCESS;
|
||||
return m_lLastError;
|
||||
}
|
||||
|
||||
DWORD WINAPI CSerialEx::ThreadProc (LPVOID lpArg)
|
||||
{
|
||||
// Route the method to the actual object
|
||||
CSerialEx* pThis = reinterpret_cast<CSerialEx*>(lpArg);
|
||||
return pThis->ThreadProc();
|
||||
}
|
||||
|
||||
DWORD CSerialEx::ThreadProc (void)
|
||||
{
|
||||
// Use overlapped structure
|
||||
LPOVERLAPPED lpOverlapped = 0;
|
||||
|
||||
// Keep looping
|
||||
do
|
||||
{
|
||||
#ifndef SERIAL_NO_OVERLAPPED
|
||||
// Reset the event handle
|
||||
::ResetEvent(m_hevtOverlappedWorkerThread);
|
||||
|
||||
// Initialize the overlapped structure
|
||||
OVERLAPPED ovInternal = {0};
|
||||
ovInternal.hEvent = m_hevtOverlappedWorkerThread;
|
||||
|
||||
// Start the WaitEvent (use our own overlapped structure)
|
||||
if (WaitEvent(&ovInternal) != ERROR_SUCCESS)
|
||||
return m_lLastError;
|
||||
|
||||
// Wait for the overlapped operation to complete
|
||||
if (::WaitForSingleObject(m_hevtOverlappedWorkerThread,INFINITE) != WAIT_OBJECT_0)
|
||||
{
|
||||
// Set the internal error code
|
||||
m_lLastError = ::GetLastError();
|
||||
|
||||
// Issue an error and quit
|
||||
_RPTF0(_CRT_WARN,"CSerialEx::ThreadProc - Unable to wait until COM event has arrived\n");
|
||||
return m_lLastError;
|
||||
}
|
||||
#else
|
||||
// Start the WaitEvent (don't need to specify an overlapped structure)
|
||||
if (WaitEvent() != ERROR_SUCCESS)
|
||||
return m_lLastError;
|
||||
#endif
|
||||
|
||||
// Wait until one of the events happens
|
||||
if (!m_fStopping)
|
||||
{
|
||||
// Determine the event
|
||||
EEvent eEvent = GetEventType();
|
||||
|
||||
// Obtain the error status during this event
|
||||
DWORD dwErrors = 0;
|
||||
if (!::ClearCommError(m_hFile,&dwErrors,0))
|
||||
{
|
||||
// Set the internal error code
|
||||
m_lLastError = ::GetLastError();
|
||||
|
||||
// Issue an error and quit
|
||||
_RPTF0(_CRT_WARN, "CSerialEx::ThreadProc - Unable to obtain COM status\n");
|
||||
}
|
||||
|
||||
// Convert the error
|
||||
EError eError = EError(dwErrors);
|
||||
|
||||
// There was a COMM event, which needs handling. We'll call the
|
||||
// event handler. We can receive a "zero" event, when the
|
||||
// mask or event character has been set. We won't pass this
|
||||
// down to the window.
|
||||
if (eEvent)
|
||||
OnEvent(eEvent,eError);
|
||||
}
|
||||
}
|
||||
while (!m_fStopping);
|
||||
|
||||
// Bye bye
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,118 @@
|
||||
// SerialEx.h - Definition of the CSerialEx class
|
||||
//
|
||||
// Copyright (C) 1999-2003 Ramon de Klein (Ramon.de.Klein@ict.nl)
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
|
||||
#ifndef __SERIAL_EX_H
|
||||
#define __SERIAL_EX_H
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Include CSerial base class
|
||||
|
||||
#include "Serial.h"
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// CSerialEx - Win32 message-based wrapper for serial communications
|
||||
//
|
||||
// A lot of MS-Windows GUI based programs use a central message
|
||||
// loop, so the application cannot block to wait for objects. This
|
||||
// make serial communication difficult, because it isn't event
|
||||
// driven using a message queue. This class makes the CSerial based
|
||||
// classes suitable for use with such a messagequeue. Whenever
|
||||
// an event occurs on the serial port, a user-defined message will
|
||||
// be sent to a user-defined window. It can then use the standard
|
||||
// message dispatching to handle the event.
|
||||
//
|
||||
// Pros:
|
||||
// -----
|
||||
// - Easy to use
|
||||
// - Fully ANSI and Unicode aware
|
||||
// - Integrates easily in GUI applications and is intuitive to
|
||||
// use for GUI application programmers
|
||||
//
|
||||
// Cons:
|
||||
// -----
|
||||
// - Uses a thread for each COM-port, which has been opened.
|
||||
// - More overhead, due to thread switching and message queues.
|
||||
// - Requires a window, but that's probably why you're using
|
||||
// this class.
|
||||
//
|
||||
// Copyright (C) 1999-2003 Ramon de Klein
|
||||
// (Ramon.de.Klein@ict.nl)
|
||||
|
||||
class CSerialEx : public CSerial
|
||||
{
|
||||
// Construction
|
||||
public:
|
||||
CSerialEx();
|
||||
virtual ~CSerialEx();
|
||||
|
||||
// Operations
|
||||
public:
|
||||
// Open the serial communications for a particular COM port. You
|
||||
// need to use the full devicename (i.e. "COM1") to open the port.
|
||||
virtual LONG Open (LPCTSTR lpszDevice, DWORD dwInQueue = 0, DWORD dwOutQueue = 0, bool fStartListener = false);
|
||||
|
||||
// Close the serial port.
|
||||
virtual LONG Close (void);
|
||||
|
||||
// Start the listener thread
|
||||
virtual LONG StartListener (void);
|
||||
|
||||
// Stop the listener thread. Because the other thread might be
|
||||
// busy processing data it might take a while, so you can specify
|
||||
// a time-out.
|
||||
virtual LONG StopListener (DWORD dwTimeout = INFINITE);
|
||||
|
||||
protected:
|
||||
// Each opened COM-port uses its own specific thread, which will
|
||||
// wait for one of the events to happen. When an event happens,
|
||||
// then the client window is send a message informing about the
|
||||
// event.
|
||||
static DWORD WINAPI ThreadProc (LPVOID lpArg);
|
||||
DWORD ThreadProc (void);
|
||||
|
||||
// Event handler
|
||||
virtual void OnEvent (EEvent eEvent, EError eError) = 0;
|
||||
|
||||
protected:
|
||||
// The WaitEvent method is being used by this class internally
|
||||
// and shouldn't be used by client applications. Client
|
||||
// application should monior the messages.
|
||||
using CSerial::WaitEvent;
|
||||
|
||||
// The event-type is send in the WPARAM of the message and
|
||||
// the GetEventType method returns the wrong data, so we'll
|
||||
// hide this method for client applications to avoid problems.
|
||||
using CSerial::GetEventType;
|
||||
using CSerial::GetError;
|
||||
|
||||
protected:
|
||||
// Internal attributes
|
||||
bool m_fStopping;
|
||||
HANDLE m_hThread;
|
||||
|
||||
#ifndef SERIAL_NO_OVERLAPPED
|
||||
// Handle for overlapped operations in worker-thread
|
||||
HANDLE m_hevtOverlappedWorkerThread;
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif // __SERIAL_EX_H
|
@ -0,0 +1,135 @@
|
||||
// SerialMFC.h - Definition of the CSerialMFC class
|
||||
//
|
||||
// Copyright (C) 1999-2003 Ramon de Klein (Ramon.de.Klein@ict.nl)
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
|
||||
#ifndef __SERIAL_MFC_H
|
||||
#define __SERIAL_MFC_H
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Include CSerialWnd base class
|
||||
|
||||
#include "SerialWnd.h"
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Make sure that MFC is already loaded
|
||||
//
|
||||
// We don't include it here, because MFC based applications typically
|
||||
// use a precompiled header file.
|
||||
|
||||
#ifndef __AFXWIN_H__
|
||||
#error "CWnd class isn't included (include AFXWIN.H)"
|
||||
#endif
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// CSerialMFC - MFC wrapper for serial communication handling
|
||||
//
|
||||
// CSerialMFC is a very thing wrapper around the CSerialWnd class,
|
||||
// which makes it more suitable for use in MFC-based applications.
|
||||
// Unfortenately, the MFC framework isn't very flexible when it comes
|
||||
// to adding custom message handlers. We cannot add our own types to
|
||||
// the message handlers, but we're stuck to use 32-bit integers.
|
||||
//
|
||||
// Add the following entry to the window's message map to make sure
|
||||
// that MFC calls your handler, when a serial message comes in.
|
||||
//
|
||||
// DECLARE_MESSAGE_MAP(CMyClass,CWnd)
|
||||
// ...
|
||||
// ON_WM_SERIAL(OnSerialMsg)
|
||||
// ...
|
||||
// END_MESSAGE_MAP()
|
||||
//
|
||||
// A typical handler could look like this:
|
||||
//
|
||||
// afx_msg LRESULT CMyClass::OnSerialMsg (WPARAM wParam, LPARAM lParam)
|
||||
// {
|
||||
// CSerial::EEvent eEvent = CSerial::EEvent(LOWORD(wParam));
|
||||
// CSerial::EError eError = CSerial::EError(HIWORD(wParam));
|
||||
//
|
||||
// // lParam: User-defined 32-bit integer (type LPARAM)
|
||||
// switch (eEvent)
|
||||
// {
|
||||
// case CSerialMFC::EEventRecv:
|
||||
// // TODO: Read data from the port
|
||||
// break;
|
||||
// ...
|
||||
// }
|
||||
//
|
||||
// // Return successful
|
||||
// return 0;
|
||||
// }
|
||||
//
|
||||
//
|
||||
// Pros:
|
||||
// -----
|
||||
// - Easy to use
|
||||
// - Fully ANSI and Unicode aware
|
||||
// - Integrates seamless in MFC applications
|
||||
//
|
||||
// Cons:
|
||||
// -----
|
||||
// - No more then CSerialWnd, except that you need MFC
|
||||
//
|
||||
// Copyright (C) 1999-2003 Ramon de Klein
|
||||
// (Ramon.de.Klein@ict.nl)
|
||||
|
||||
class CSerialMFC : public CSerialWnd
|
||||
{
|
||||
// Operations
|
||||
public:
|
||||
// Open the serial communications for a particular COM port. You
|
||||
// need to use the full devicename (i.e. "COM1") to open the port.
|
||||
virtual LONG Open (LPCTSTR lpszDevice, CWnd* pwndDest, UINT nComMsg = WM_NULL, LPARAM lParam = 0, DWORD dwInQueue = 0, DWORD dwOutQueue = 0)
|
||||
{
|
||||
|
||||
CString strTemp = _T("\\\\.\\");
|
||||
strTemp += lpszDevice;
|
||||
return CSerialWnd::Open(strTemp.GetBuffer(0), pwndDest->GetSafeHwnd(), nComMsg, lParam, dwInQueue, dwOutQueue);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//return CSerialWnd::Open(lpszDevice, pwndDest->GetSafeHwnd(), nComMsg, lParam, dwInQueue, dwOutQueue);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Message map macro for the default COM message
|
||||
|
||||
#define ON_WM_SERIAL(memberFxn) \
|
||||
ON_REGISTERED_MESSAGE(CSerialMFC::mg_nDefaultComMsg,memberFxn)
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Don't link to the default runtime libraries, because this will
|
||||
// give a warning during link-time.
|
||||
|
||||
#ifdef _DEBUG
|
||||
#pragma comment(linker,"/nodefaultlib:LIBCD")
|
||||
#else
|
||||
#pragma comment(linker,"/nodefaultlib:LIBC")
|
||||
#endif
|
||||
|
||||
|
||||
#endif // __SERIAL_MFC_H
|
@ -0,0 +1,131 @@
|
||||
// SerialWnd.cpp - Implementation of the CSerialWnd class
|
||||
//
|
||||
// Copyright (C) 1999-2003 Ramon de Klein (Ramon.de.Klein@ict.nl)
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Include the standard header files
|
||||
|
||||
|
||||
#include "pch.h"
|
||||
#include <crtdbg.h>
|
||||
#include <tchar.h>
|
||||
#include <windows.h>
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Include module headerfile
|
||||
|
||||
#include "SerialWnd.h"
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Disable warning C4127: conditional expression is constant, which
|
||||
// is generated when using the _RPTF and _ASSERTE macros.
|
||||
|
||||
#pragma warning(disable: 4127)
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Enable debug memory manager
|
||||
|
||||
#ifdef _DEBUG
|
||||
|
||||
#ifdef THIS_FILE
|
||||
#undef THIS_FILE
|
||||
#endif
|
||||
|
||||
static const char THIS_FILE[] = __FILE__;
|
||||
#define new DEBUG_NEW
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Code
|
||||
|
||||
// Register the standard CSerialWnd COM message
|
||||
const UINT CSerialWnd::mg_nDefaultComMsg = ::RegisterWindowMessage(_T("CSerialWnd_DefaultComMsg"));
|
||||
|
||||
|
||||
CSerialWnd::CSerialWnd()
|
||||
: m_hwndDest(0)
|
||||
, m_nComMsg(WM_NULL)
|
||||
, m_lParam(0)
|
||||
{
|
||||
}
|
||||
|
||||
CSerialWnd::~CSerialWnd()
|
||||
{
|
||||
// Check if the thread handle is still there. If so, then we
|
||||
// didn't close the serial port. We cannot depend on the
|
||||
// CSerial destructor, because if it calls Close then it
|
||||
// won't call our overridden Close.
|
||||
if (m_hThread)
|
||||
{
|
||||
// Display a warning
|
||||
_RPTF0(_CRT_WARN, "CSerialWnd::~CSerialWnd - Serial port not closed\n");
|
||||
|
||||
// Close implicitly
|
||||
Close();
|
||||
}
|
||||
}
|
||||
|
||||
LONG CSerialWnd::Open (LPCTSTR lpszDevice, HWND hwndDest, UINT nComMsg, LPARAM lParam, DWORD dwInQueue, DWORD dwOutQueue)
|
||||
{
|
||||
// Call the base class first
|
||||
long lLastError = CSerialEx::Open(lpszDevice,dwInQueue,dwOutQueue);
|
||||
if (lLastError != ERROR_SUCCESS)
|
||||
return lLastError;
|
||||
|
||||
// Save the window handle, notification message and user message
|
||||
m_hwndDest = hwndDest;
|
||||
m_nComMsg = nComMsg?nComMsg:mg_nDefaultComMsg;
|
||||
m_lParam = lParam;
|
||||
|
||||
// Start the listener thread
|
||||
lLastError = StartListener();
|
||||
if (lLastError != ERROR_SUCCESS)
|
||||
{
|
||||
// Close the serial port
|
||||
Close();
|
||||
|
||||
// Return the error-code
|
||||
m_lLastError = lLastError;
|
||||
return m_lLastError;
|
||||
}
|
||||
|
||||
// Return the error
|
||||
m_lLastError = ERROR_SUCCESS;
|
||||
return m_lLastError;
|
||||
}
|
||||
|
||||
LONG CSerialWnd::Close (void)
|
||||
{
|
||||
// Reset all members
|
||||
m_hwndDest = 0;
|
||||
m_nComMsg = WM_NULL;
|
||||
|
||||
// Call the base class
|
||||
return CSerialEx::Close();
|
||||
}
|
||||
|
||||
void CSerialWnd::OnEvent (EEvent eEvent, EError eError)
|
||||
{
|
||||
// Post message to the client window
|
||||
::PostMessage(m_hwndDest,m_nComMsg,MAKEWPARAM(eEvent,eError),LPARAM(m_lParam));
|
||||
}
|
@ -0,0 +1,91 @@
|
||||
// SerialWnd.h - Definition of the CSerialWnd class
|
||||
//
|
||||
// Copyright (C) 1999-2003 Ramon de Klein (Ramon.de.Klein@ict.nl)
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
|
||||
#ifndef __SERIAL_WND_H
|
||||
#define __SERIAL_WND_H
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Include CSerialEx base class
|
||||
|
||||
#include "SerialEx.h"
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// CSerialWnd - Win32 message-based wrapper for serial communications
|
||||
//
|
||||
// A lot of MS-Windows GUI based programs use a central message
|
||||
// loop, so the application cannot block to wait for objects. This
|
||||
// make serial communication difficult, because it isn't event
|
||||
// driven using a message queue. This class makes the CSerial based
|
||||
// classes suitable for use with such a messagequeue. Whenever
|
||||
// an event occurs on the serial port, a user-defined message will
|
||||
// be sent to a user-defined window. It can then use the standard
|
||||
// message dispatching to handle the event.
|
||||
//
|
||||
// Pros:
|
||||
// -----
|
||||
// - Easy to use
|
||||
// - Fully ANSI and Unicode aware
|
||||
// - Integrates easily in GUI applications and is intuitive to
|
||||
// use for GUI application programmers
|
||||
//
|
||||
// Cons:
|
||||
// -----
|
||||
// - Uses a thread for each COM-port, which has been opened.
|
||||
// - More overhead, due to thread switching and message queues.
|
||||
// - Requires a window, but that's probably why you're using
|
||||
// this class.
|
||||
//
|
||||
// Copyright (C) 1999-2003 Ramon de Klein
|
||||
// (Ramon.de.Klein@ict.nl)
|
||||
|
||||
class CSerialWnd : public CSerialEx
|
||||
{
|
||||
// Construction
|
||||
public:
|
||||
CSerialWnd();
|
||||
virtual ~CSerialWnd();
|
||||
|
||||
// Operations
|
||||
public:
|
||||
// Open the serial communications for a particular COM port. You
|
||||
// need to use the full devicename (i.e. "COM1") to open the port.
|
||||
virtual LONG Open (LPCTSTR lpszDevice, HWND hwndDest, UINT nComMsg=WM_NULL, LPARAM lParam=0, DWORD dwInQueue = 0, DWORD dwOutQueue = 0);
|
||||
|
||||
// Close the serial port.
|
||||
virtual LONG Close (void);
|
||||
|
||||
protected:
|
||||
// Event handler that is called when
|
||||
virtual void OnEvent (EEvent eEvent, EError eError);
|
||||
|
||||
public:
|
||||
// Default Serial notification message
|
||||
static const UINT mg_nDefaultComMsg;
|
||||
|
||||
protected:
|
||||
// Internal attributes
|
||||
HWND m_hwndDest;
|
||||
UINT m_nComMsg;
|
||||
LONG m_lParam;
|
||||
};
|
||||
|
||||
#endif // __SERIAL_WND_H
|
Binary file not shown.
Binary file not shown.
@ -0,0 +1,226 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<VCProjectVersion>15.0</VCProjectVersion>
|
||||
<ProjectGuid>{12662F45-5722-45B9-8C02-2863C436C1F6}</ProjectGuid>
|
||||
<Keyword>MFCProj</Keyword>
|
||||
<RootNamespace>TimeSet</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<UseOfMfc>Static</UseOfMfc>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<UseOfMfc>Static</UseOfMfc>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<UseOfMfc>Static</UseOfMfc>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v141</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<UseOfMfc>Static</UseOfMfc>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="Shared">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
</Link>
|
||||
<Midl>
|
||||
<MkTypLibCompatible>false</MkTypLibCompatible>
|
||||
<ValidateAllParameters>true</ValidateAllParameters>
|
||||
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</Midl>
|
||||
<ResourceCompile>
|
||||
<Culture>0x0412</Culture>
|
||||
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ResourceCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
</Link>
|
||||
<Midl>
|
||||
<MkTypLibCompatible>false</MkTypLibCompatible>
|
||||
<ValidateAllParameters>true</ValidateAllParameters>
|
||||
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</Midl>
|
||||
<ResourceCompile>
|
||||
<Culture>0x0412</Culture>
|
||||
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ResourceCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
<Midl>
|
||||
<MkTypLibCompatible>false</MkTypLibCompatible>
|
||||
<ValidateAllParameters>true</ValidateAllParameters>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</Midl>
|
||||
<ResourceCompile>
|
||||
<Culture>0x0412</Culture>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ResourceCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
<Midl>
|
||||
<MkTypLibCompatible>false</MkTypLibCompatible>
|
||||
<ValidateAllParameters>true</ValidateAllParameters>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</Midl>
|
||||
<ResourceCompile>
|
||||
<Culture>0x0412</Culture>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ResourceCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="framework.h" />
|
||||
<ClInclude Include="pch.h" />
|
||||
<ClInclude Include="Resource.h" />
|
||||
<ClInclude Include="Serial.h" />
|
||||
<ClInclude Include="SerialEx.h" />
|
||||
<ClInclude Include="SerialMFC.h" />
|
||||
<ClInclude Include="SerialWnd.h" />
|
||||
<ClInclude Include="targetver.h" />
|
||||
<ClInclude Include="TimeSet.h" />
|
||||
<ClInclude Include="TimeSetDlg.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="pch.cpp">
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Serial.cpp" />
|
||||
<ClCompile Include="SerialEx.cpp" />
|
||||
<ClCompile Include="SerialWnd.cpp" />
|
||||
<ClCompile Include="TimeSet.cpp" />
|
||||
<ClCompile Include="TimeSetDlg.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="TimeSet.rc" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="res\TimeSet.rc2" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Image Include="res\TimeSet.ico" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
@ -0,0 +1,84 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="소스 파일">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="헤더 파일">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="리소스 파일">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="TimeSet.h">
|
||||
<Filter>헤더 파일</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="TimeSetDlg.h">
|
||||
<Filter>헤더 파일</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="framework.h">
|
||||
<Filter>헤더 파일</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="targetver.h">
|
||||
<Filter>헤더 파일</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Resource.h">
|
||||
<Filter>헤더 파일</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="pch.h">
|
||||
<Filter>헤더 파일</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Serial.h">
|
||||
<Filter>헤더 파일</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="SerialEx.h">
|
||||
<Filter>헤더 파일</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="SerialMFC.h">
|
||||
<Filter>헤더 파일</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="SerialWnd.h">
|
||||
<Filter>헤더 파일</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="TimeSet.cpp">
|
||||
<Filter>소스 파일</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="TimeSetDlg.cpp">
|
||||
<Filter>소스 파일</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="pch.cpp">
|
||||
<Filter>소스 파일</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Serial.cpp">
|
||||
<Filter>소스 파일</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="SerialEx.cpp">
|
||||
<Filter>소스 파일</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="SerialWnd.cpp">
|
||||
<Filter>소스 파일</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="TimeSet.rc">
|
||||
<Filter>리소스 파일</Filter>
|
||||
</ResourceCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="res\TimeSet.rc2">
|
||||
<Filter>리소스 파일</Filter>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Image Include="res\TimeSet.ico">
|
||||
<Filter>리소스 파일</Filter>
|
||||
</Image>
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<RESOURCE_FILE>TimeSet.rc</RESOURCE_FILE>
|
||||
</PropertyGroup>
|
||||
</Project>
|
After Width: | Height: | Size: 66 KiB |
Binary file not shown.
Loading…
Reference in new issue