?? nt_com.c
字號:
/*::::::::::::::::::::::::::: RX routines ::::::::::::::::::::::::::::::::::*/
/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
DWORD host_com_get_error( tAdapter adapter )
{
register pHostCom current = & host_com[adapter]; // Set ptr to current adapter
DWORD error;
if (current->host_adapter_status == HOST_ADAPTER_NOT_OPEN && !host_com_open( adapter ))
return FALSE; /* Exit, unable to open adapter */
if (current->rx_curr == current->rx_end)
{
error = current->rx_error;
current->rx_error = 0;
return error;
}
else
return 0;
}
BOOL host_com_rx_avail( tAdapter adapter )
{
register pHostCom current = & host_com[adapter]; // Set ptr to current adapter
DWORD bytesread = 0;
DWORD error = 0;
if (current->host_adapter_status != HOST_ADAPTER_OPEN && !host_com_open( adapter ))
return FALSE; /* Exit, unable to open adapter */
if (current->rx_curr != current->rx_end)
return TRUE;
read_comm( current, &bytesread );
// get communication error status
ClearCommError( current->handle, &(current->rx_error), NULL );
current->rx_curr = current->rx_buffer;
current->rx_end = current->rx_buffer + bytesread;
return (current->rx_curr != current->rx_end);
}
BOOL host_com_read_rx( tAdapter adapter, BYTE *data )
{
if (host_com_rx_avail( adapter ))
{
*data = *(host_com[adapter].rx_curr++);
#if (XMIT_BUFFER)
shrink_TX_buffer( adapter );
#endif
return TRUE;
}
else
{
return FALSE;
}
}
/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
/*:::::::::::::::::::::::: Write to comms port :::::::::::::::::::::::::::::*/
/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
BOOL host_com_write_tx( tAdapter adapter, BYTE data )
{
if (host_com[adapter].host_adapter_status == HOST_ADAPTER_NOT_OPEN && !host_com_open( adapter ))
return FALSE; /* Exit, unable to open adapter */
#if (XMIT_BUFFER)
post_transmit( adapter, data );
#else //(XMIT_BUFFER)
write_comm( &host_com[adapter], &data, 1 );
#endif //(XMIT_BUFFER)
return TRUE;
}
/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
ULONG host_com_ioctl( tAdapter adapter, int request, long arg )
{
DWORD ModemState;
ULONG ReturnState = 0;
register pHostCom current = & host_com[adapter]; /* Define and set 'current' adaptor pointer */
/*:::::::::::::::::::::::::::::::::: Are we dealing with a null adapter */
if (current->host_adapter_status != HOST_ADAPTER_OPEN)
{
// Attempt to open adapter !
if (request == HOST_COM_MSTATUS || !host_com_open(adapter))
{
return ReturnState;
}
}
/*:::::::::::::::::::::::::::::::::::::::::::::: Identify ioctl request */
switch (request)
{
/*:::::::::::::::::::::::::::::::::::::::::: Process break requests */
case HOST_COM_SBRK: /* Set BREAK */
SetCommBreak(current->handle);
break;
case HOST_COM_CBRK: /* Clear BREAK */
ClearCommBreak(current->handle);
break;
/*::::::::::::::::::::::::::::::::::::::::: Process baud rate change */
case HOST_COM_BAUD:
if (GetCommState( current->handle, &(current->dcb) ))
{
current->dcb.BaudRate = arg;
SetCommState( current->handle, &(current->dcb) );
}
break;
/*:::::::::::::::::::::::::::::::::: Process modem control requests */
case HOST_COM_MODEM_CTRL: /* DTR & RTS lines */
if (arg & HOST_MC_DTR)
EscapeCommFunction( current->handle, SETDTR );
else
EscapeCommFunction( current->handle, CLRDTR );
if (arg & HOST_MC_RTS)
EscapeCommFunction( current->handle, CLRRTS );
else
EscapeCommFunction( current->handle, SETRTS );
break;
/*::::::::::::::::::::::::::::::::::::::::::::: Return modem status */
case HOST_COM_MSTATUS: /* Get modem state */
GetCommModemStatus( current->handle, &ModemState );
if (ModemState & MS_CTS_ON) ReturnState |= HOST_MS_CTS;
if (ModemState & MS_RING_ON) ReturnState |= HOST_MS_RI;
if (ModemState & MS_DSR_ON) ReturnState |= HOST_MS_DSR;
if (ModemState & MS_RLSD_ON) ReturnState |= HOST_MS_RLSD;
current->modem_status = ReturnState;
break;
/*:::::::::::::::::::::::::::::::::::::::::::::::: Set line control */
case HOST_COM_LINE_CTRL:
if (GetCommState( current->handle, &(current->dcb) ))
{
current->dcb.ByteSize = (BYTE)arg & HOST_LC_DATABITS;
switch (arg & HOST_LC_STOPBITS)
{
case HOST_LC_STOP_1:
current->dcb.StopBits = ONESTOPBIT;
break;
case HOST_LC_STOP_2:
current->dcb.StopBits = TWOSTOPBITS;
break;
case HOST_LC_STOP_15:
current->dcb.StopBits = ONE5STOPBITS;
break;
default:
break;
}
switch (arg & HOST_LC_PARITY)
{
case HOST_LC_PARITY_EVEN:
current->dcb.Parity=EVENPARITY;
current->dcb.fParity=1; /* ensure parity enabled */
break;
case HOST_LC_PARITY_ODD:
current->dcb.Parity=ODDPARITY;
current->dcb.fParity=1; /* ensure parity enabled */
break;
case HOST_LC_PARITY_MARK:
current->dcb.Parity=MARKPARITY;
current->dcb.fParity=1; /* ensure parity enabled */
break;
case HOST_LC_PARITY_SPACE:
current->dcb.Parity=SPACEPARITY;
current->dcb.fParity=1; /* ensure parity enabled */
break;
case HOST_LC_PARITY_NONE:
current->dcb.Parity=NOPARITY;
current->dcb.fParity=0; /* disable parity */
break;
}
SetCommState( current->handle, &(current->dcb) );
}
break;
/*::::::::::::::::::::::::::::::::::::::: Unrecognised host_com ioctl */
default:
break;
}
return ReturnState;
}
/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
/*:::::::::::::::::::::: Initialize comms port :::::::::::::::::::::::::::::*/
/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
void host_com_init()
{
tAdapter adapter;
register pHostCom current;
#if (XMIT_BUFFER)
int buffer_num;
// set up transmit buffer free pool
TX_queue[TX_FREE_QUEUE].head = NULL;
TX_queue[TX_FREE_QUEUE].tail = NULL;
TX_queue[TX_FREE_QUEUE].wait[0] = CreateMutex( NULL, FALSE, NULL);
TX_queue[TX_FREE_QUEUE].wait[1] = CreateSemaphore( NULL, 0, NUM_TX_BUFFERS, NULL);
// set up transmit buffers
for (buffer_num = 0; buffer_num < NUM_TX_BUFFERS; buffer_num++)
{
TX_q_buff[buffer_num].buffer.wait[0] = CreateMutex( NULL, FALSE, NULL);
TX_q_buff[buffer_num].buffer.wait[1] = CreateEvent( NULL, TRUE, FALSE, NULL);
TX_q_buff[buffer_num].buffer.adapter = TX_FREE_QUEUE;
TX_q_buff[buffer_num].buffer.Overlap.hEvent = CreateEvent( NULL, TRUE, TRUE, NULL );
TX_enqueue( TX_FREE_QUEUE, &TX_q_buff[buffer_num] );
}
#endif //(XMIT_BUFFER)
// set up ports
for (adapter = 0; adapter < NUM_SERIAL_PORTS; adapter++)
{
current = & host_com[adapter];
current->host_adapter_status = HOST_ADAPTER_NOT_OPEN;
current->handle = (HANDLE) -1;
current->ReOpenCounter = 0;
current->RXThreadHandle = NULL;
/* critical section used to lock access to adapter from the base */
InitializeCriticalSection(¤t->AdapterLock);
current->AdapterLockCnt = 0;
current->WaitOverlap.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
current->RXOverlap.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
#if (!XMIT_BUFFER)
current->TXOverlap.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
#endif
com_init( adapter );
}
}
/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
/*::::::::::::::::::::: Deinitialize comms port ::::::::::::::::::::::::::::*/
/*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
void host_com_exit()
{
tAdapter adapter;
int buffer_num;
// close ports
for (adapter = 0; adapter < NUM_SERIAL_PORTS; adapter++)
{
com_close( adapter );
host_com_close( adapter );
CloseHandle( host_com[adapter].WaitOverlap.hEvent );
CloseHandle( host_com[adapter].RXOverlap.hEvent );
#if (!XMIT_BUFFER)
CloseHandle( host_com[adapter].TXOverlap.hEvent );
#endif
/*............... Delete RX critical section and RX control objects */
DeleteCriticalSection( &host_com[adapter].AdapterLock );
}
#if (XMIT_BUFFER)
// close transmit buffers
for (buffer_num = 0; buffer_num < NUM_TX_BUFFERS; buffer_num++)
{
CloseHandle( TX_q_buff[buffer_num].buffer.wait[0] );
CloseHandle( TX_q_buff[buffer_num].buffer.wait[1] );
}
// close transmit buffer free pool
CloseHandle( TX_queue[TX_FREE_QUEUE].wait[0] );
CloseHandle( TX_queue[TX_FREE_QUEUE].wait[1] );
#endif //(XMIT_BUFFER)
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -