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

📄 comport.c

📁 Open DMT Client C Source code
💻 C
📖 第 1 页 / 共 5 页
字号:
        logWARNING(LOGSRC,"ComPort structure is 'null'");        return (ComPort_t*)0;            } else    if (comPortIsOpen(com)) {                /* close */        //logDEBUG(LOGSRC,"Closing port %d", com->name);        if (com->read_fd != fileno(stdin)) {            // don't close stdin            close(com->read_fd);            if ((com->write_fd >= 0) && (com->read_fd != com->write_fd) && (com->write_fd != fileno(stdout))) {                close(com->write_fd);            }            com->read_fd  = -1;            com->write_fd = -1;        }                /* re-open */        logDEBUG(LOGSRC,"Reopenning port %d", com->name);        ComPort_t newCom;        if (comPortOpen(&newCom, com->name, com->bps, DTAFMT_8N1, com->hwFlow)) {            newCom.flags  = com->flags;            newCom.logger = com->logger;            memcpy(com, &newCom, sizeof(newCom));            return com;        }            }        /* error */    com->error = COMERR_GENERAL;    return (ComPort_t*)0;    }#endif // defined(TARGET_WINCE)/* return true if port is open */utBool comPortIsOpen(ComPort_t *com){    return (com && com->open)? utTrue : utFalse;}// ----------------------------------------------------------------------------#if defined(TARGET_WINCE)void comPortClose(ComPort_t *com){    if (com) { // don't use "comPortIsOpen(com)"                /* close port ID */        if (com->portId != INVALID_HANDLE_VALUE) {            CloseHandle(com->portId);            com->portId = INVALID_HANDLE_VALUE;        }                /* clear structure */        // save error?        comPortInitStruct(com);        // restore error?            }}#elsevoid comPortClose(ComPort_t *com){    if (comPortIsOpen(com)) {        if (com->read_fd != fileno(stdin)) {            // don't close stdin/stdout            close(com->read_fd);            if ((com->write_fd >= 0) && (com->read_fd != com->write_fd) && (com->write_fd != fileno(stdout))) {                close(com->write_fd);            }            com->read_fd  = -1;            com->write_fd = -1;        }        comPortInitStruct(com);    }}#endif // defined(TARGET_WINCE)// ----------------------------------------------------------------------------/* return name of specified port */const char *comPortName(ComPort_t *com){    if (comPortIsOpen(com)) {        if (!(*com->name)) {            // init port name            _comPortNameForPort(com->name, com->port);        }        return com->name;    } else {        return ComName_INVALID;    }}// ----------------------------------------------------------------------------/* the the timeout vtime */#if defined(TARGET_WINCE)// not supported #elsestatic utBool _comPortSetVtimeMS(ComPort_t *com, long timeoutMS){    if (comPortIsOpen(com)) {        struct termios options;        tcgetattr(com->read_fd, &options);        if (timeoutMS <= 0L) {            options.c_cc[VTIME] = 0L;                   // block forever        } else {            long deciSec = (timeoutMS + 99L) / 100L;    // millisec => decisec (round up)            if (deciSec <= 0L) {                options.c_cc[VTIME] = 1;                // don't let it be zero            } else            if (deciSec <= 255L) {                options.c_cc[VTIME] = deciSec;          // range 1 <= VTIME <= 255            } else {                // internal error                logWARNING(LOGSRC,"Warning: VTIME cannot be > 255 [%ld]", deciSec);                options.c_cc[VTIME] = 255;              // max 255            }        }        com->lastVtimeMS = (long)options.c_cc[VTIME] * 100L; // deciSec => milliSec        if (tcsetattr(com->read_fd, TCSANOW, &options) == 0) {            // success            errno = 0;            return utTrue;        } else {            // error (error in 'errno')            return utFalse;        }    } else {        errno = EBADF;        return utFalse;    }}#endif // !defined(TARGET_WINCE)#if defined(TARGET_WINCE)// not supported#elsestatic long _comPortGetVtimeMS(ComPort_t *com){    if (comPortIsOpen(com)) {        return com->lastVtimeMS;    } else {        return -1L;    }}#endif // !defined(TARGET_WINCE)// ----------------------------------------------------------------------------/* return the 'read' ComPort file descriptor */#if defined(TARGET_WINCE)// not supported#elsestatic int _comPortGetFD(ComPort_t *com){    if (comPortIsOpen(com)) {        return com->read_fd;    } else {        errno = ENODEV;        return -1;    }}#endif // !defined(TARGET_WINCE)#if defined(TARGET_WINCE)// not supported#elsestatic void _comPortSetControl(ComPort_t *com, int ctlMask, utBool state){    int fd = _comPortGetFD(com);    if (fd >= 0) {        int status;        ioctl(fd, TIOCMGET, &status);        if (state) {            status |= ctlMask;        } else {            status &= ~ctlMask;        }        ioctl(fd, TIOCMSET, &status);    }}#endif // !defined(TARGET_WINCE)#if defined(TARGET_WINCE)// not supported#elsestatic utBool _comPortGetControl(ComPort_t *com, int ctlMask){    int fd = _comPortGetFD(com);    if (fd >= 0) {        int status;        ioctl(fd, TIOCMGET, &status);        return (status & ctlMask)? utTrue : utFalse;    }    return utFalse;}#endif // !defined(TARGET_WINCE)// ----------------------------------------------------------------------------// Data-Terminal-Ready (-->)#if defined(TARGET_WINCE)void comPortSetDTR(ComPort_t *com, utBool state){    if (comPortIsOpen(com)) {        EscapeCommFunction(com->portId, (state?SETDTR:CLRDTR));    }}#elsevoid comPortSetDTR(ComPort_t *com, utBool state){    _comPortSetControl(com, TIOCM_DTR, state);}#endif // defined(TARGET_WINCE)#if defined(TARGET_WINCE)// not yet implemented#elseutBool comPortGetDTR(ComPort_t *com){    return _comPortGetControl(com, TIOCM_DTR);}#endif // defined(TARGET_WINCE)// ----------------------------------------------------------------------------// Request-To-Send (-->)#if defined(TARGET_WINCE)void comPortSetRTS(ComPort_t *com, utBool state){    if (comPortIsOpen(com)) {        EscapeCommFunction(com->portId, (state?SETRTS:CLRRTS));    }}#elsevoid comPortSetRTS(ComPort_t *com, utBool state){    _comPortSetControl(com, TIOCM_RTS, state);}#endif // defined(TARGET_WINCE)#if defined(TARGET_WINCE)// not yet implemented#elseutBool comPortGetRTS(ComPort_t *com){    return _comPortGetControl(com, TIOCM_RTS);}#endif // defined(TARGET_WINCE)// ----------------------------------------------------------------------------// Clear-To-Send (<--)#if defined(TARGET_WINCE)// not yet implemented#elsevoid comPortSetCTS(ComPort_t *com, utBool state){    _comPortSetControl(com, TIOCM_CTS, state);}#endif // defined(TARGET_WINCE)#if defined(TARGET_WINCE)utBool comPortGetCTS(ComPort_t *com){    if (comPortIsOpen(com)) {        DWORD modemStat = 0;        GetCommModemStatus(com->portId, &modemStat);        return (modemStat & MS_CTS_ON)? utTrue : utFalse;    } else {        return utFalse;    }}#elseutBool comPortGetCTS(ComPort_t *com){    return _comPortGetControl(com, TIOCM_CTS);}#endif // defined(TARGET_WINCE)// ----------------------------------------------------------------------------#if defined(TARGET_WINCE)utBool comPortGetDSR(ComPort_t *com){    if (comPortIsOpen(com)) {        DWORD modemStat = 0;        GetCommModemStatus(com->portId, &modemStat);        return (modemStat & MS_DSR_ON)? utTrue : utFalse;    } else {        return utFalse;    }}#else// not yet implemented#endif// ----------------------------------------------------------------------------// Data-Carrier-Detect (<--)#if defined(TARGET_WINCE)// not yet implemented#elsevoid comPortSetDCD(ComPort_t *com, utBool state){    _comPortSetControl(com, TIOCM_CD, state);}#endif // defined(TARGET_WINCE)#if defined(TARGET_WINCE)// not yet implemented#elseutBool comPortGetDCD(ComPort_t *com){    return _comPortGetControl(com, TIOCM_CD);}#endif // defined(TARGET_WINCE)// ----------------------------------------------------------------------------/* set options for the specified ComPort */void comPortSetOptions(ComPort_t *com, UInt16 flags){    if (com != (ComPort_t*)0) {        com->flags = flags;    }}/* add options to the specified ComPort */void comPortAddOptions(ComPort_t *com, UInt16 flags){    if (com != (ComPort_t*)0) {        com->flags |= flags;    }}/* add options to the specified ComPort */void comPortRemoveOptions(ComPort_t *com, UInt16 flags){    if (com != (ComPort_t*)0) {        com->flags &= ~flags;    }}/* return true if the specified ComPort has backspace mode set */UInt16 comPortGetOptions(ComPort_t *com){    return com->flags;}// ----------------------------------------------------------------------------/* push character back into comport read buffer */void comPortPush(ComPort_t *com, UInt8 ch){    if (com != (ComPort_t*)0) {        // ComPort_t currently only support a 1 character cache.        if (com->push > 0) {            logWARNING(LOGSRC,"Char already pushed for port '%s'", com->name);        }        com->push = ch;    }}// ----------------------------------------------------------------------------/* return number of bytes available for reading on specified ComPort */#if defined(TARGET_WINCE)// not yet implemented#elseint comPortGetAvail(ComPort_t *com, long timeoutMS){    // Do not check 'com->push' here!    // This routine is for checking to see if we have data available on the     // physical com port.    /* no timeout? */    if (timeoutMS <= 0L) {        // if we don't care about a timeout, always return that we        // have at least 1 byte available        return 1;    }        /* wait until data is available */    fd_set rfds;    struct timeval tv;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -