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

📄 c_comthread.cpp

📁 对日本KSG震动探测仪器编写的伴侣服务代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// (Version 1.00 :: 10-Mar-1999 :: Harutoshi Yoshida)
/*===================================================================
	俲俽俧(恔搙忣曬僱僢僩儚乕僋)
	-----------------------------------
		COMM 惂屼梡
	-----------------------------------
	Program Name        : C_ComThread.cpp
	Program Start       : 07-Jan-1999
===================================================================*/

#include	"stdafx.h"
#include	"C_Define.h"
#include	"C_ComThread.h"
#include	"C_Work.h"


TTYINFO   pTTYInfo_WRK[MAX_CH+1];

//---------------------------------------------------------------------------
//  Description:
//     Creates the tty information structure and sets
//     menu option availability.  Returns -1 if unsuccessful.
//
//  Parameters:
//     HWND  hWnd
//        Handle to main window.
//
//  Win-32 Porting Issues:
//     - Needed to initialize TERMWND( npTTYInfo ) for secondary thread.
//     - Needed to create/initialize overlapped structures used in reads &
//       writes to COMM device.
//---------------------------------------------------------------------------
LRESULT NEAR CreateTTYInfo(int ch, int port)
{
	NPTTYINFO	npTTYInfo;

	npTTYInfo = &pTTYInfo_WRK[ch];
	// initialize TTY info structure

	CHANNEL( npTTYInfo )       = ch;
	COMDEV( npTTYInfo )        = 0;
	CONNECTED( npTTYInfo )     = FALSE;
	CURSORSTATE( npTTYInfo )   = CS_HIDE;
	LOCALECHO( npTTYInfo )     = FALSE;
	AUTOWRAP( npTTYInfo )      = TRUE;
	PORT( npTTYInfo )          = port;
	BAUDRATE( npTTYInfo )      = CBR_9600;
	BYTESIZE( npTTYInfo )      = 8;
	FLOWCTRL( npTTYInfo )      = FC_RTSCTS;
	PARITY( npTTYInfo )        = NOPARITY;
	STOPBITS( npTTYInfo )      = ONESTOPBIT;
	XONXOFF( npTTYInfo )       = FALSE;
	XSIZE( npTTYInfo )         = 0;
	YSIZE( npTTYInfo )         = 0;
	XSCROLL( npTTYInfo )       = 0;
	YSCROLL( npTTYInfo )       = 0;
	XOFFSET( npTTYInfo )       = 0;
	YOFFSET( npTTYInfo )       = 0;
	COLUMN( npTTYInfo )        = 0;
	ROW( npTTYInfo )           = 0;
	HTTYFONT( npTTYInfo )      = NULL;
	FGCOLOR( npTTYInfo )       = RGB( 0, 0, 0 );
	USECNRECEIVE( npTTYInfo )  = TRUE;
	DISPLAYERRORS( npTTYInfo ) = TRUE;
	WRITE_OS( npTTYInfo ).Offset = 0;
	WRITE_OS( npTTYInfo ).OffsetHigh = 0;
	READ_OS( npTTYInfo ).Offset = 0;
	READ_OS( npTTYInfo ).OffsetHigh = 0;
	//TERMWND( npTTYInfo ) =       hWnd;

	// create I/O event used for overlapped reads / writes
	READ_OS( npTTYInfo ).hEvent = CreateEvent(	NULL,		// no security
												TRUE,		// explicit reset req
												FALSE,		// initial event reset
												NULL );		// no name

	if (READ_OS( npTTYInfo ).hEvent == NULL){
		LocalFree( npTTYInfo );
		return (-1);
	}
	WRITE_OS( npTTYInfo ).hEvent = CreateEvent(	NULL,		// no security
												TRUE,		// explicit reset req
												FALSE,		// initial event reset
												NULL);		// no name
	if (NULL == WRITE_OS( npTTYInfo ).hEvent){
		CloseHandle( READ_OS( npTTYInfo ).hEvent );
		LocalFree( npTTYInfo );

		return ( -1 );
	}

	// clear screen space
	_fmemset( SCREEN( npTTYInfo ), ' ', MAXROWS * MAXCOLS );

	// setup default font information
	LFTTYFONT( npTTYInfo ).lfHeight =         9;
	LFTTYFONT( npTTYInfo ).lfWidth =          0;
	LFTTYFONT( npTTYInfo ).lfEscapement =     0;
	LFTTYFONT( npTTYInfo ).lfOrientation =    0;
	LFTTYFONT( npTTYInfo ).lfWeight =         0;
	LFTTYFONT( npTTYInfo ).lfItalic =         0;
	LFTTYFONT( npTTYInfo ).lfUnderline =      0;
	LFTTYFONT( npTTYInfo ).lfStrikeOut =      0;
	LFTTYFONT( npTTYInfo ).lfCharSet =        OEM_CHARSET;
	LFTTYFONT( npTTYInfo ).lfOutPrecision =   OUT_DEFAULT_PRECIS;
	LFTTYFONT( npTTYInfo ).lfClipPrecision =  CLIP_DEFAULT_PRECIS;
	LFTTYFONT( npTTYInfo ).lfQuality =        DEFAULT_QUALITY;
	LFTTYFONT( npTTYInfo ).lfPitchAndFamily = FIXED_PITCH | FF_MODERN;
	lstrcpy( LFTTYFONT( npTTYInfo ).lfFaceName, "FixedSys" );

	return ( (LRESULT) TRUE );
}


//---------------------------------------------------------------------------
//  Description:
//     This routines sets up the DCB based on settings in the
//     TTY info structure and performs a SetCommState().
//
//  Parameters:
//     HWND hWnd
//        handle to TTY window
//
//  Win-32 Porting Issues:
//     - Win-32 requires a slightly different processing of the DCB.
//       Changes were made for configuration of the hardware handshaking
//       lines.
//---------------------------------------------------------------------------
BOOL NEAR SetupConnection(int ch)
{
	BOOL       fRetVal;
	BYTE       bSet;
	DCB        dcb;
	NPTTYINFO  npTTYInfo;

	npTTYInfo = &pTTYInfo_WRK[ch];

	dcb.DCBlength = sizeof( DCB );
	GetCommState( COMDEV( npTTYInfo ), &dcb );

	dcb.BaudRate = BAUDRATE( npTTYInfo );
	dcb.ByteSize = BYTESIZE( npTTYInfo );
	dcb.Parity = PARITY( npTTYInfo );
	dcb.StopBits = STOPBITS( npTTYInfo );

	// setup hardware flow control
	bSet = (BYTE) ((FLOWCTRL( npTTYInfo ) & FC_DTRDSR) != 0);
	dcb.fOutxDsrFlow = bSet;
	if (bSet){
		dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
	}
	else{
		dcb.fDtrControl = DTR_CONTROL_ENABLE;
	}

	bSet = (BYTE) ((FLOWCTRL( npTTYInfo ) & FC_RTSCTS) != 0);
	dcb.fOutxCtsFlow = bSet;
	if (bSet){
		dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
	}
	else{
		dcb.fRtsControl = RTS_CONTROL_ENABLE;
	}

	// setup software flow control
	bSet = (BYTE) ((FLOWCTRL( npTTYInfo ) & FC_XONXOFF) != 0);

	dcb.fInX = dcb.fOutX = bSet;
	dcb.XonChar = ASCII_XON;
	dcb.XoffChar = ASCII_XOFF;
	dcb.XonLim = 100;
	dcb.XoffLim = 100;

	// other various settings
	dcb.fBinary = TRUE;
	dcb.fParity = TRUE;

	fRetVal = SetCommState( COMDEV( npTTYInfo ), &dcb );
	return ( fRetVal );
}

//---------------------------------------------------------------------------
//  Description:
//     Opens communication port specified in the TTYINFO struct.
//     It also sets the CommState and notifies the window via
//     the fConnected flag in the TTYINFO struct.
//
//  Parameters:
//     HWND hWnd
//        handle to TTY window
//
//  Win-32 Porting Issues:
//     - OpenComm() is not supported under Win-32.  Use CreateFile()
//       and setup for OVERLAPPED_IO.
//     - Win-32 has specific communication timeout parameters.
//     - Created the secondary thread for event notification.
//---------------------------------------------------------------------------
BOOL NEAR OpenConnection(int ch)
{
	char       szPort[ 15 ];//@@, szTemp[ 10 ];
	BOOL       fRetVal;
	HCURSOR    hOldCursor, hWaitCursor;
	NPTTYINFO  npTTYInfo;

	HANDLE        hCommWatchThread;
	DWORD         dwThreadID;
	COMMTIMEOUTS  CommTimeOuts;

	npTTYInfo = &pTTYInfo_WRK[ch];

	// show the hourglass cursor
	hWaitCursor = LoadCursor( NULL, IDC_WAIT );
	hOldCursor = SetCursor( hWaitCursor );

	// load the COM prefix string and append port number
	// 02-Apr-1999
	wsprintf( szPort, "\\\\.\\COM%d", PORT( npTTYInfo ) );

	// open COMM device
	if ((COMDEV( npTTYInfo ) =
		CreateFile( szPort, GENERIC_READ | GENERIC_WRITE,
					0,						// exclusive access
					NULL,					// no security attrs
					OPEN_ALWAYS,			// OPEN_EXISTING,
					FILE_ATTRIBUTE_NORMAL |
					FILE_FLAG_OVERLAPPED,	// overlapped I/O
					NULL )) == (HANDLE) -1 ){

		return ( FALSE );
	}
	else{
		// get any early notifications
		SetCommMask( COMDEV( npTTYInfo ), EV_RXCHAR );

		// setup device buffers
		SetupComm( COMDEV( npTTYInfo ), 1024, 1024);

		// purge any information in the buffer
		PurgeComm( COMDEV( npTTYInfo ), PURGE_TXABORT | PURGE_RXABORT |
										PURGE_TXCLEAR | PURGE_RXCLEAR );

		// set up for overlapped I/O

		CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
		CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
		CommTimeOuts.ReadTotalTimeoutConstant = 1000;
		// CBR_9600 is approximately 1byte/ms. For our purposes, allow
		// double the expected time per character for a fudge factor.
		CommTimeOuts.WriteTotalTimeoutMultiplier = 2*CBR_9600/BAUDRATE( npTTYInfo );
		CommTimeOuts.WriteTotalTimeoutConstant = 0;
		SetCommTimeouts( COMDEV( npTTYInfo ), &CommTimeOuts );
	}

	fRetVal = SetupConnection(ch);

	if (fRetVal){
		CONNECTED( npTTYInfo ) = TRUE;

		// Create a secondary thread
		// to watch for an event.

		if (NULL == (hCommWatchThread =
					CreateThread( (LPSECURITY_ATTRIBUTES) NULL,
									0,
									(LPTHREAD_START_ROUTINE) CommWatchProc,
									(LPVOID) npTTYInfo,
									0, &dwThreadID ))){

			CONNECTED( npTTYInfo ) = FALSE;
			CloseHandle( COMDEV( npTTYInfo ) );
			fRetVal = FALSE;
		}
		else{
			THREADID( npTTYInfo ) = dwThreadID;
			HTHREAD( npTTYInfo ) = hCommWatchThread;

			// assert DTR
			EscapeCommFunction( COMDEV( npTTYInfo ), SETDTR );
		}
	}
	else{
		CONNECTED( npTTYInfo ) = FALSE;
		CloseHandle( COMDEV( npTTYInfo ) );
	}

	// restore cursor

	SetCursor( hOldCursor );

	return ( fRetVal );
}

//---------------------------------------------------------------------------
//  Description:OpenConnection
//     Writes a block of data to the COM port specified in the associated
//     TTY info structure.
//
//  Parameters:
//     HWND hWnd
//        handle to TTY window
//
//     BYTE *pByte
//        pointer to data to write to port
//
//  Win-32 Porting Issues:
//     - WriteComm() has been replaced by WriteFile() in Win-32.
//     - Overlapped I/O has been implemented.
//---------------------------------------------------------------------------
BOOL NEAR WriteCommBlock(int ch, LPSTR lpByte , DWORD dwBytesToWrite)
{

	BOOL		fWriteStat;
	DWORD		dwBytesWritten;
	NPTTYINFO	npTTYInfo;
	DWORD		dwErrorFlags;
	DWORD		dwError;
	DWORD		dwBytesSent=0;
	COMSTAT		ComStat;
	char		szError[ 128 ];

	npTTYInfo = &pTTYInfo_WRK[ch];
	fWriteStat = WriteFile( COMDEV( npTTYInfo ), lpByte, dwBytesToWrite,
							&dwBytesWritten, &WRITE_OS( npTTYInfo ) );

	if (!fWriteStat){
		if (GetLastError() == ERROR_IO_PENDING){
			while (!GetOverlappedResult( COMDEV( npTTYInfo ),
										&WRITE_OS( npTTYInfo ), &dwBytesWritten, TRUE )){

				dwError = GetLastError();
				if (dwError == ERROR_IO_INCOMPLETE){
					// normal result if not finished
					dwBytesSent += dwBytesWritten;
					continue;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -