📄 c_comthread.cpp
字号:
// (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 + -