📄 ulibwin.c
字号:
}
//
// If wanted # bytes are available, break out and read 'em.
//
if (stat.cbInQue >= wanted)
break; // We have enough, break out!
//
// Be friendly to Windows' cooperative multitasking...
//
ddelay(0);
//
// If timeout is zero, return immediately.
//
if (stop_time == 0)
return(stat.cbInQue);
//
// Check for timeout. If timed out, return.
//
time( &now );
if(stop_time <= now)
{
printmsg(15, "sread: timeout(%d) - %d chars avail",
timeout, stat.cbInQue);
return(stat.cbInQue);
}
} // end of while(TRUE)
//
// We have enough in the RX queue. Grab 'em right into the
// caller's buffer.
//
received = ReadComm(nCid, output, wanted);
printmsg(15, "sread: Got %d characters, %d still in RX queue.",
(int)received, (int)(stat.cbInQue - received));
/*--------------------------------------------------------------------*/
/* Log the newly received data */
/*--------------------------------------------------------------------*/
traceData( output, wanted, FALSE );
return(received);
} /* nsread */
/*--------------------------------------------------------------------*/
/* n s w r i t e */
/* */
/* Write to the serial port */
/*--------------------------------------------------------------------*/
int nswrite(const char *data, unsigned int len)
{
int bytes;
int rc;
hangupNeeded = TRUE; /* Flag that the port is now dirty */
/*--------------------------------------------------------------------*/
/* Report our modem status */
/*--------------------------------------------------------------------*/
ShowModem();
/*--------------------------------------------------------------------*/
/* Write the data out as the queue becomes available */
/*--------------------------------------------------------------------*/
bytes = WriteComm(nCid, data, len);
rc = GetCommError(nCid, NULL);
if (rc)
{
printmsg(0,"nswrite: WriteComm failed, "
"return code from GetCommError was %#04x (%d)",
rc , rc);
ShowError(rc);
return bytes;
}
/*--------------------------------------------------------------------*/
/* Log the data written */
/*--------------------------------------------------------------------*/
traceData( data, len, TRUE );
/*--------------------------------------------------------------------*/
/* Return bytes written to the port to the caller */
/*--------------------------------------------------------------------*/
return len;
} /* nswrite */
/*--------------------------------------------------------------------*/
/* n s s e n d b r k */
/* */
/* send a break signal out the serial port */
/*--------------------------------------------------------------------*/
void nssendbrk(unsigned int duration)
{
#ifdef UDEBUG
printmsg(12, "ssendbrk: %d", duration);
#endif
SetCommBreak(nCid);
ddelay(duration == 0 ? 200 : duration);
ClearCommBreak(nCid);
} /*ssendbrk*/
/*--------------------------------------------------------------------*/
/* n c l o s e l i n e */
/* */
/* Close the serial port down */
/*--------------------------------------------------------------------*/
void ncloseline(void)
{
if ( ! portActive )
panic();
portActive = FALSE; /* flag port closed for error handler */
hangupNeeded = FALSE; /* Don't fiddle with port any more */
/*--------------------------------------------------------------------*/
/* Lower DTR */
/*--------------------------------------------------------------------*/
if (EscapeCommFunction(nCid, CLRDTR | CLRRTS) != 0)
printmsg(0,"closeline: Unable to lower DTR/RTS");
/*--------------------------------------------------------------------*/
/* Actually close the port */
/*--------------------------------------------------------------------*/
if(CloseComm(nCid) != 0)
printmsg(0, "closeline: close of serial port failed");
/*--------------------------------------------------------------------*/
/* Stop logging the data to disk */
/*--------------------------------------------------------------------*/
traceStop();
printmsg(3,"Serial port closed");
} /* ncloseline */
/*--------------------------------------------------------------------*/
/* n h a n g u p */
/* */
/* Hangup the telephone by dropping DTR. Works with HAYES and */
/* many compatibles. */
/* 14 May 89 Drew Derbyshire */
/*--------------------------------------------------------------------*/
void nhangup( void )
{
hangupNeeded = FALSE;
/*--------------------------------------------------------------------*/
/* Drop DTR */
/*--------------------------------------------------------------------*/
if (EscapeCommFunction(nCid, CLRDTR) != 0)
{
printmsg(0, "hangup: Unable to lower DTR for comm port");
panic();
}
/*--------------------------------------------------------------------*/
/* Wait for the telephone to hangup */
/*--------------------------------------------------------------------*/
printmsg(3,"hangup: Dropped DTR");
ddelay(1000); /* Really only need 250 milliseconds (HA) */
/*--------------------------------------------------------------------*/
/* Bring DTR backup */
/*--------------------------------------------------------------------*/
if (EscapeCommFunction(nCid, SETDTR) != 0)
{
printmsg(0, "hangup: Unable to raise DTR for comm port");
panic();
}
ddelay(500); /* Now wait for the poor thing to recover */
} /* nhangup */
/*--------------------------------------------------------------------*/
/* S I O S p e e d */
/* */
/* Re-specify the speed of an opened serial port */
/*--------------------------------------------------------------------*/
void nSIOSpeed(BPS baud)
{
WORD rc;
currentSpeed = (UINT) baud;
printmsg(15,"SIOSpeed: Setting baud rate to %lu",
(unsigned long) currentSpeed);
ShowModem();
GetCommState (nCid, &dcb);
dcb.BaudRate = currentSpeed;
rc = SetCommState (&dcb);
if (rc)
{
printmsg(0,"SIOSPeed: Unable to set baud rate for port to %lu",
(unsigned long) currentSpeed);
panic();
}
} /* nSIOSpeed */
/*--------------------------------------------------------------------*/
/* n f l o w c o n t r o l */
/* */
/* Enable/Disable in band (XON/XOFF) flow control */
/*--------------------------------------------------------------------*/
void nflowcontrol( boolean flow )
{
int rc;
DCB dcb;
GetCommState(nCid, &dcb);
if (flow)
{
dcb.fOutX = TRUE;
dcb.fInX = TRUE;
dcb.fRtsflow = FALSE;
dcb.fOutxCtsFlow = FALSE;
}
else {
dcb.fOutX = FALSE;
dcb.fInX = FALSE;
dcb.fRtsflow = TRUE;
dcb.fOutxCtsFlow = TRUE;
}
if ((rc = SetCommState(&dcb)) != 0)
{
printmsg(0,"flowcontrol: Unable to set flow control");
printmsg(0,"Return code fromSetCommState was %#04x (%d)",
(int) rc,
(int) rc);
panic();
} /*if */
} /* nflowcontrol */
/*--------------------------------------------------------------------*/
/* n G e t S p e e d */
/* */
/* Report current speed of communications connection */
/*--------------------------------------------------------------------*/
BPS nGetSpeed( void )
{
return currentSpeed;
} /* GetSpeed */
/*--------------------------------------------------------------------*/
/* n C D */
/* */
/* Return status of carrier detect */
/*--------------------------------------------------------------------*/
boolean nCD( void )
{
boolean online = carrierdetect;
boolean modem_present;
carrierdetect = ((*lpbModemBits & MSR_RLSD) != 0);
modem_present = ((*lpbModemBits & MSR_DSR) != 0);
/*--------------------------------------------------------------------*/
/* If we previously had carrier detect but have lost it, we */
/* report it was lost. If we do not yet have carrier detect, */
/* we return success because we may not have connected yet. */
/* If DSR is not present, we always report no carrier, as there */
/* is either no modem at all(!) or it's not turned on. */
/*--------------------------------------------------------------------*/
if (online)
return (modem_present && carrierdetect);
else
return (modem_present);
} /* nCD */
/*--------------------------------------------------------------------*/
/* S h o w M o d e m */
/* */
/* Report current modem status when changed from last call */
/*--------------------------------------------------------------------*/
#define mannounce(flag, bits, text ) (((flag & bits) != 0) ? text : "" )
static void ShowModem( void )
{
BYTE modem_bits = *lpbModemBits;
static BYTE old_bits = 0xFF;
if ( debuglevel < 4 )
return;
if ( (debuglevel < 4) || // Silent at lower debuglevels
(modem_bits == old_bits)) // Show only changes in modem signals
return;
printmsg(0, "ShowModem: %#02x %s %s %s",
modem_bits,
mannounce(MSR_RLSD, modem_bits, "DCD"),
mannounce(MSR_DSR, modem_bits, "DSR"),
mannounce(MSR_CTS, modem_bits, "CTS"));
old_bits = modem_bits;
} /* ShowModem */
/*--------------------------------------------------------------------*/
/* S h o w E r r o r */
/* */
/* Report modem error bits in English (more or less) */
/*--------------------------------------------------------------------*/
static void ShowError( int status )
{
printmsg(2, "Port Error: %#04x%s%s%s%s%s",
status,
mannounce(CE_RXOVER, status, " Recv Queue Ovfl"),
mannounce(CE_OVERRUN, status, " Hardware Overrun"),
mannounce(CE_RXPARITY, status, " Parity Error"),
mannounce(CE_FRAME, status, " Framing Error"),
mannounce(CE_TXFULL, status, " Xmit Queue Full"));
} /* ShowError */
/*--------------------------------------------------------------------*/
/* s e t P r t y */
/* */
/* No operation under Windows */
/*--------------------------------------------------------------------*/
#ifdef __TURBOC__
#pragma argsused
#endif
void setPrty( const KEWSHORT priorityIn, const KEWSHORT prioritydeltaIn )
{
} /* setPrty */
/*--------------------------------------------------------------------*/
/* r e s e t P r t y */
/* */
/* No operation under Windows */
/*--------------------------------------------------------------------*/
void resetPrty( void )
{
} /* resetPrty */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -