Example #1
0
RBAPI(bool) com_Send(int com, unsigned char* buf, int bsize) {
    unsigned long nowtime;
    int numbytes = 0, bsize2;

    if (COM_duplex[com] == COM_HDUPLEX_RTS)
    {
        MPOS_Start();
        set_rts(com);
    }

    while (bsize > 0)
    {
        bsize2 = (bsize <= MAXRWSIZE)? bsize : MAXRWSIZE;
        
        for (nowtime = timer_nowtime(); bsize2 > 0; buf += numbytes, bsize2 -= numbytes, bsize -= numbytes)
        {
            #if defined(RB_MSVC_WIN32) || defined(RB_MSVC_WINCE)
                if (WriteFile(COM_info[com].fp, buf, bsize2, (LPDWORD)&numbytes, NULL) == FALSE)
                {
                    err_SetMsg(ERROR_COM_SENDFAIL, "WriteFile() fails");
                    goto SEND_FAIL;
                }
            #elif defined(RB_LINUX)
                if ((numbytes = write(COM_info[com].fp, buf, bsize2)) < 0)
                {
                    err_SetMsg(ERROR_COM_SENDFAIL, "write() fails");
                    goto SEND_FAIL;
                }
            #else
                // TODO ...
                err_SetMsg(ERROR_COM_INVALID, "unsupported platform");
                goto SEND_FAIL;
            #endif
            
            if ((timer_nowtime() - nowtime) > COM_TIMEOUT)
            {
                err_SetMsg(ERROR_COM_SENDFAIL, "time-out to write bytes");
                goto SEND_FAIL;
            }
        } // for (nowtime...
    } // end while (bsize...

    if (COM_duplex[com] == COM_HDUPLEX_RTS)
    {
        com_FlushWFIFO(com);
        clear_rts(com);
        MPOS_End();
    }

    return true;
    
SEND_FAIL:
    if (COM_duplex[com] == COM_HDUPLEX_RTS)
    {
        clear_rts(com);
        MPOS_End();
    }
    return false;
}
Example #2
0
RBAPI(void) com_Close(int com) {
    if(com_InUse(com) == false) return;

    com_FlushWFIFO(com);
    com_ClearRFIFO(com);

    #if defined(RB_MSVC_WIN32) || defined(RB_MSVC_WINCE)
        SetCommTimeouts(COM_info[com].fp, &COM_info[com].oldtimeouts);
        SetCommState(COM_info[com].fp, &(COM_info[com].oldstate));
    	CloseHandle(COM_info[com].fp);
    #elif defined(RB_LINUX)
        tcsetattr(COM_info[com].fp, TCSANOW, &(COM_info[com].oldstate));
        close(COM_info[com].fp);
    #endif

    if (COM_oldTMode[com] == true) com_EnableTurboMode(com); else com_DisableTurboMode(com);
    if (COM_oldFMode[com] == true) com_EnableFIFO32(com);    else com_DisableFIFO32(com);

    io_Close(COM_ioSection[com]);
    COM_ioSection[com] = -1;
}