亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? win_qextserialport.cpp

?? 一個虛擬串口的例子代碼
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
/*!
\class Win_QextSerialPort
\version 0.70 (pre-alpha)
\author Wayne Roth

A cross-platform serial port class.
This class encapsulates the Windows portion of QextSerialPort.  The user will be notified of 
errors and possible portability conflicts at run-time by default - this behavior can be turned 
off by defining _TTY_NOWARN_ (to turn off all warnings) or _TTY_NOWARN_PORT_ (to turn off 
portability warnings) in the project.  Note that defining _TTY_NOWARN_ also defines 
_TTY_NOWARN_PORT_.

\note 
On Windows NT/2000/XP this class uses Win32 serial port functions by default.  The user may 
select POSIX behavior under NT, 2000, or XP ONLY by defining _TTY_POSIX_ in the project. I can 
make no guarantees as to the quality of POSIX support under NT/2000 however.

*/

#include <stdio.h>
#include "win_qextserialport.h"

/*!
\fn Win_QextSerialPort::Win_QextSerialPort()
Default constructor.  Note that the name of the device used by a Win_QextSerialPort constructed 
with this constructor will be determined by #defined constants, or lack thereof - the default 
behavior is the same as _TTY_LINUX_.  Possible naming conventions and their associated constants 
are:

\verbatim

Constant         Used By         Naming Convention
----------       -------------   ------------------------
_TTY_WIN_        Windows         COM1, COM2
_TTY_IRIX_       SGI/IRIX        /dev/ttyf1, /dev/ttyf2
_TTY_HPUX_       HP-UX           /dev/tty1p0, /dev/tty2p0
_TTY_SUN_        SunOS/Solaris   /dev/ttya, /dev/ttyb
_TTY_DIGITAL_    Digital UNIX    /dev/tty01, /dev/tty02
_TTY_LINUX_      Linux           /dev/ttyS0, /dev/ttyS1
<none>           Linux           /dev/ttyS0, /dev/ttyS1
\endverbatim

This constructor associates the object with the first port on the system, e.g. COM1 for Windows 
platforms.  See the other constructor if you need a port other than the first.
*/
Win_QextSerialPort::Win_QextSerialPort():QextSerialBase() {}

/*!Win_QextSerialPort::Win_QextSerialPort(const Win_QextSerialPort&)
Copy constructor.
*/
Win_QextSerialPort::Win_QextSerialPort(const Win_QextSerialPort& s):QextSerialBase(s.portName) {
    portOpen=s.portOpen;
    lastErr=s.lastErr;
    memcpy(portName, s.portName, sizeof(portName));
    Settings.FlowControl=s.Settings.FlowControl;
    Settings.Parity=s.Settings.Parity;
    Settings.DataBits=s.Settings.DataBits;
    Settings.StopBits=s.Settings.StopBits;
    Settings.BaudRate=s.Settings.BaudRate;
    Win_Handle=s.Win_Handle;
	memcpy(&Win_CommConfig, &s.Win_CommConfig, sizeof(COMMCONFIG));
	memcpy(&Win_CommTimeouts, &s.Win_CommTimeouts, sizeof(COMMTIMEOUTS));
}

/*!
\fn Win_QextSerialPort::Win_QextSerialPort(const char* devName)
Constructs a serial port attached to the port specified by devName.
devName is the name of the device, which is windowsystem-specific, 
e.g."COM2" or "/dev/ttyS0".
*/
Win_QextSerialPort::Win_QextSerialPort(const char* name):QextSerialBase(name) {
    setTimeout(0, 500);
}

/*!
\fn Win_QextSerialPort::Win_QextSerialPort(const PortSettings& settings)
Constructs a port with default name and specified settings.
*/
Win_QextSerialPort::Win_QextSerialPort(const PortSettings& settings) {
    construct();
    setBaudRate(settings.BaudRate);
    setDataBits(settings.DataBits);
    setStopBits(settings.StopBits);
    setParity(settings.Parity);
    setFlowControl(settings.FlowControl);
    setTimeout(settings.Timeout_Sec, settings.Timeout_Millisec);
}

/*!
\fn Win_QextSerialPort::Win_QextSerialPort(const char* name, const PortSettings& settings)
Constructs a port with specified name and settings.
*/
Win_QextSerialPort::Win_QextSerialPort(const char* name, const PortSettings& settings) {
    construct();
    setName(name);
    setBaudRate(settings.BaudRate);
    setDataBits(settings.DataBits);
    setStopBits(settings.StopBits);
    setParity(settings.Parity);
    setFlowControl(settings.FlowControl);
    setTimeout(settings.Timeout_Sec, settings.Timeout_Millisec);
}

/*!
\fn Win_QextSerialPort::~Win_QextSerialPort() 
Standard destructor.
*/
Win_QextSerialPort::~Win_QextSerialPort() {
    if (portOpen) {
        close();
    }
}

/*!
\fn Win_QextSerialPort& operator=(const Win_QextSerialPort& s) 
overrides the = operator
*/
Win_QextSerialPort& Win_QextSerialPort::operator=(const Win_QextSerialPort& s) {
    portOpen=s.isOpen();
    lastErr=s.lastErr;
    memcpy(portName, s.portName, sizeof(portName));
    Settings.FlowControl=s.Settings.FlowControl;
    Settings.Parity=s.Settings.Parity;
    Settings.DataBits=s.Settings.DataBits;
    Settings.StopBits=s.Settings.StopBits;
    Settings.BaudRate=s.Settings.BaudRate;
    Win_Handle=s.Win_Handle;
	memcpy(&Win_CommConfig, &s.Win_CommConfig, sizeof(COMMCONFIG));
	memcpy(&Win_CommTimeouts, &s.Win_CommTimeouts, sizeof(COMMTIMEOUTS));
    return *this;
}

/*!
\fn Win_QextSerialPort::construct(void)
Common constructor function, called by all versions of Win_QextSerialPort::Win_QextSerialPort().
Sets up default port settings (115200 8N1 Hardware flow control where supported, otherwise no
flow control, and 500 ms timeout).
*/
void Win_QextSerialPort::construct(void) {
    QextSerialBase::construct();
    setBaudRate(BAUD115200);
    setDataBits(DATA_8);
    setStopBits(STOP_1);
    setParity(PAR_NONE);
    setFlowControl(FLOW_HARDWARE);
    Win_Handle=INVALID_HANDLE_VALUE;
}

/*!
\fn bool Win_QextSerialPort::open(int)
Opens a serial port.  Note that this function does not specify which device to open.  If you need
to open a device by name, see Win_QextSerialPort::open(const char*).  This function has no effect
if the port associated with the class is already open.  The port is also configured to the current
settings, as stored in the Settings structure.
*/
bool Win_QextSerialPort::open(int) {
    unsigned long confSize;
    LOCK_MUTEX();
    if (!portOpen) {

        /*open the port*/
        Win_Handle=CreateFileA(portName, GENERIC_READ|GENERIC_WRITE, 
                              FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
        if (Win_Handle!=INVALID_HANDLE_VALUE) {
            portOpen=true;

            /*configure port settings*/
            GetCommConfig(Win_Handle, &Win_CommConfig, &confSize);
            GetCommState(Win_Handle, &(Win_CommConfig.dcb));
            Win_CommConfig.dcb.fBinary=TRUE;
            Win_CommConfig.dcb.fInX=FALSE;
            Win_CommConfig.dcb.fOutX=FALSE;
	        Win_CommConfig.dcb.fAbortOnError=FALSE;
            Win_CommConfig.dcb.fNull=FALSE;

            /*half second timeout by default*/
	        setTimeout(Win_CommTimeouts.ReadTotalTimeoutConstant/1000, 
                       Win_CommTimeouts.ReadTotalTimeoutConstant%1000);

            /*set up parameters*/
            setBaudRate(Settings.BaudRate);
            setDataBits(Settings.DataBits);
            setStopBits(Settings.StopBits);                               
            setParity(Settings.Parity);
            setFlowControl(Settings.FlowControl);
        }
    }
    UNLOCK_MUTEX();
    return portOpen;
}

/*!
\fn void Win_QextSerialPort::close()
Closes a serial port.  This function has no effect if the serial port associated with the class
is not currently open.
*/
void Win_QextSerialPort::close() {
    LOCK_MUTEX();
    CloseHandle(Win_Handle);
    portOpen=false;
    UNLOCK_MUTEX();
}

/*!
\fn void Win_QextSerialPort::flush()
Flushes all pending I/O to the serial port.  This function has no effect if the serial port
associated with the class is not currently open.
*/
void Win_QextSerialPort::flush() {
    LOCK_MUTEX();
    if (portOpen) {
        FlushFileBuffers(Win_Handle);
    }
    UNLOCK_MUTEX();
}

/*!
\fn Offset Win_QextSerialPort::size() const
This function will return the number of bytes waiting in the receive queue of the serial port.
It is included primarily to provide a complete QIODevice interface, and will not record errors
in the lastErr member (because it is const).  This function is also not thread-safe - in 
multithreading situations, use Win_QextSerialPort::bytesWaiting() instead.
*/
Offset Win_QextSerialPort::size() const {
    int availBytes;
    COMSTAT Win_ComStat;
    DWORD Win_ErrorMask=0;
    ClearCommError(Win_Handle, &Win_ErrorMask, &Win_ComStat);
    availBytes = Win_ComStat.cbInQue;
    return (Offset)availBytes;
}

/*!
\fn int Win_QextSerialPort::bytesWaiting()
Returns the number of bytes waiting in the port's receive queue.  This function will return 0 if
the port is not currently open, or -1 on error.  Error information can be retrieved by calling 
Win_QextSerialPort::getLastError().
*/
int Win_QextSerialPort::bytesWaiting() {
    LOCK_MUTEX();
    if (portOpen) {
        DWORD Errors;
        COMSTAT Status;
        BOOL success=ClearCommError(Win_Handle, &Errors, &Status);
        translateError(Errors);
        if (success) {
            lastErr=E_NO_ERROR;
            UNLOCK_MUTEX();
            return Status.cbInQue;
        }
        UNLOCK_MUTEX();
        return (unsigned int)-1;
    }
    UNLOCK_MUTEX();
    return 0;
}

/*!
\fn void Win_QextSerialPort::translateError(unsigned long error)
Translates a system-specific error code to a QextSerialPort error code.  Used internally.
*/
void Win_QextSerialPort::translateError(unsigned long error) {
    if (error&CE_BREAK) {
        lastErr=E_BREAK_CONDITION;
    }
    else if (error&CE_FRAME) {
        lastErr=E_FRAMING_ERROR;
    }
    else if (error&CE_IOE) {
        lastErr=E_IO_ERROR;
    }
    else if (error&CE_MODE) {
        lastErr=E_INVALID_FD;
    }
    else if (error&CE_OVERRUN) {
        lastErr=E_BUFFER_OVERRUN;
    }
    else if (error&CE_RXPARITY) {
        lastErr=E_RECEIVE_PARITY_ERROR;
    }
    else if (error&CE_RXOVER) {
        lastErr=E_RECEIVE_OVERFLOW;
    }
    else if (error&CE_TXFULL) {
        lastErr=E_TRANSMIT_OVERFLOW;
    }
}
            
/*!
\fn Q_LONG Win_QextSerialPort::readBlock(char *data, uint maxlen)
Reads a block of data from the serial port.  This function will read at most maxlen bytes from
the serial port and place them in the buffer pointed to by data.  Return value is the number of 
bytes actually read, or -1 on error.  This function will have no effect if the serial port 
associated with the class is not currently open.
*/
Q_LONG Win_QextSerialPort::readBlock(char *data, 
#ifdef QTVER_PRE_30                                     
                                     uint maxlen) 
#else
                                     unsigned long maxlen)
#endif
{
    LOCK_MUTEX();
    int retVal=0;
    if (portOpen) {
        COMSTAT Win_ComStat;
        DWORD Win_BytesRead=0;
        DWORD Win_ErrorMask=0;
        ClearCommError(Win_Handle, &Win_ErrorMask, &Win_ComStat);
        if (Win_ComStat.cbInQue && 
            (!ReadFile(Win_Handle, (void*)data, (DWORD)maxlen, &Win_BytesRead, NULL)
            || Win_BytesRead==0)) {
            lastErr=E_READ_FAILED;
            retVal=-1;
        }
        else {
            retVal=((int)Win_BytesRead);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
韩国三级中文字幕hd久久精品| a4yy欧美一区二区三区| 国产精品自在在线| 欧美日韩在线不卡| 国产精品五月天| 久久av资源站| 欧美日韩视频专区在线播放| 亚洲欧洲成人自拍| 国产麻豆一精品一av一免费 | 午夜精品久久久久久久| 国产98色在线|日韩| 欧美成人一区二区| 日韩精品一级二级| 欧美性色黄大片手机版| 中文字幕一区二区三区在线观看| 国产一区二区三区香蕉| 日韩一区二区精品葵司在线| 亚洲尤物在线视频观看| 色呦呦日韩精品| 国产精品久久久一本精品| 国精产品一区一区三区mba桃花| 51久久夜色精品国产麻豆| 亚洲自拍偷拍av| 在线免费观看成人短视频| 国产精品三级av在线播放| 国产老肥熟一区二区三区| 欧美变态口味重另类| 日本欧美一区二区在线观看| 欧美亚洲动漫制服丝袜| 一区二区三区在线视频播放| 色偷偷久久人人79超碰人人澡| 国产精品乱码久久久久久| www.日韩精品| 亚洲精品免费播放| 欧美亚洲禁片免费| 图片区日韩欧美亚洲| 日韩一卡二卡三卡国产欧美| 免费在线看成人av| 欧美一区三区四区| 久久激情综合网| 久久久高清一区二区三区| 国产一区在线观看麻豆| 国产亚洲成av人在线观看导航| 国产成人免费网站| 亚洲国产精品成人综合色在线婷婷| 成人精品视频一区二区三区| 亚洲色图另类专区| 欧美视频一区二区三区在线观看| 亚洲成年人网站在线观看| 91精品国产乱| 国产一区二区三区免费在线观看| 欧美激情一二三区| 色伊人久久综合中文字幕| 亚洲国产日韩精品| 欧美电影免费观看完整版| 国模少妇一区二区三区| 亚洲色欲色欲www| 欧美久久久久久蜜桃| 狠狠色丁香婷婷综合久久片| 自拍视频在线观看一区二区| 欧美午夜电影网| 另类人妖一区二区av| 国产精品你懂的在线| 色天天综合久久久久综合片| 蜜桃精品在线观看| 国产精品久久看| 欧美精品自拍偷拍| 成人精品国产免费网站| 性久久久久久久久久久久| www亚洲一区| 欧美日韩激情在线| 成人动漫av在线| 免费人成黄页网站在线一区二区| 国产三级精品视频| 欧美精品xxxxbbbb| 菠萝蜜视频在线观看一区| 琪琪久久久久日韩精品| 亚洲人123区| 精品久久一二三区| 欧美中文字幕一区| 成人开心网精品视频| 日韩成人午夜电影| 亚洲欧美国产三级| 久久久久97国产精华液好用吗 | 韩国三级电影一区二区| 亚洲一级不卡视频| 国产精品麻豆视频| 亚洲精品一区在线观看| 欧美日韩一二区| av在线播放一区二区三区| 国产在线精品免费| 麻豆一区二区三区| 视频一区二区欧美| 亚洲一区二区在线播放相泽| 国产精品国产三级国产普通话99 | 久久99在线观看| 一区二区国产视频| 中文字幕视频一区二区三区久| 日韩欧美一级在线播放| 欧美精品粉嫩高潮一区二区| 色猫猫国产区一区二在线视频| 91黄色激情网站| proumb性欧美在线观看| 国产成人av自拍| 极品少妇xxxx精品少妇偷拍| 日韩中文字幕不卡| 亚洲国产精品综合小说图片区| 综合婷婷亚洲小说| 国产精品理论在线观看| 国产精品私人自拍| 国产欧美日本一区二区三区| 久久久精品天堂| 欧美国产综合色视频| 国产婷婷一区二区| 国产女主播一区| 国产精品免费人成网站| 国产精品毛片久久久久久| 国产精品欧美久久久久一区二区| 中文字幕免费观看一区| 中文字幕二三区不卡| 1024成人网| 亚洲精品菠萝久久久久久久| 亚洲国产欧美在线| 日韩高清不卡一区二区| 激情综合网最新| 国产成人精品一区二区三区网站观看 | 欧美日韩高清一区二区三区| 欧美日韩国产首页在线观看| 欧美日本视频在线| 精品盗摄一区二区三区| 久久―日本道色综合久久| 欧美国产日韩在线观看| 国产精品对白交换视频| 亚洲一区二区不卡免费| 毛片av一区二区| 成人午夜视频免费看| 日本道在线观看一区二区| 欧美日韩美少妇| 精品国产伦理网| 亚洲欧洲一区二区三区| 亚洲专区一二三| 精品一区二区在线观看| 风间由美一区二区三区在线观看 | 日韩激情av在线| 韩国v欧美v日本v亚洲v| 成人高清免费观看| 欧美色偷偷大香| 日韩三级视频在线看| 精品国精品国产| 国产精品国产三级国产a| 五月婷婷激情综合网| 国产一区二区视频在线播放| 91浏览器打开| 欧美一区二区三区免费在线看| 欧美激情在线一区二区| 午夜久久电影网| 成人18视频日本| 日韩欧美一区二区在线视频| 自拍偷拍亚洲欧美日韩| 美女在线视频一区| 色综合久久久久综合体桃花网| 777奇米四色成人影色区| 国产精品少妇自拍| 青娱乐精品在线视频| 91亚洲精品久久久蜜桃| 中文字幕亚洲一区二区va在线| 毛片不卡一区二区| 91成人网在线| 国产精品视频yy9299一区| 免费观看成人av| 色呦呦一区二区三区| 国产日韩欧美激情| 久久国产尿小便嘘嘘尿| 欧美在线免费视屏| 中文字幕一区二区不卡| 国产成人在线看| 精品国产a毛片| 蜜臀国产一区二区三区在线播放 | 天天操天天综合网| 91婷婷韩国欧美一区二区| 久久久精品国产免大香伊| 日本大胆欧美人术艺术动态| 欧美在线播放高清精品| 中文字幕在线观看一区二区| 国产精品18久久久久久vr| 欧美一级片免费看| 婷婷国产在线综合| 欧美色图天堂网| 亚洲乱码中文字幕综合| 成人av在线一区二区三区| 日本一区二区三区四区 | 日韩av网站免费在线| 欧美亚洲综合一区| 亚洲一区二区精品视频| 在线免费不卡电影| 亚洲影院免费观看| 欧美性做爰猛烈叫床潮| 亚洲一区二区高清| 欧美日韩国产不卡| 日本伊人色综合网|