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

📄 nt_com.c

📁 DD sample implements serial port support for the Virtual DOS Machine (VDM). Driver for windows. Tool
💻 C
📖 第 1 页 / 共 3 页
字号:
/*::::::::::::::::::::::::::: 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(&current->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 + -