QtextSerialPort是Qt4下比较好用的串口工具类,也是我一直使用的,但是该类有一定不完善的地方,最近通过阅读源代码,做了一点点修改。

 

  1.   Win_QextSerialPort::open函数中会使用isOpen判断串口是否已经打开,如果没有打开,才进行CreateFileA创建串口,然后调用setBaudRate设置串口波特率,但是setBaudRate函数中也会判断isOpen已经打开了,才会去设置串口波特率,所以会出现,在open之后,串口的打开参数都错误的现象,修改前的代码如下:
      1. bool Win_QextSerialPort::open(OpenMode mode) {
            unsigned long confSize = sizeof(COMMCONFIG);
            Win_CommConfig.dwSize = confSize;
            DWORD dwFlagsAndAttributes = 0;
            if (queryMode() == QextSerialBase::EventDriven)
                dwFlagsAndAttributes += FILE_FLAG_OVERLAPPED;
        
            LOCK_MUTEX();
            if (mode == QIODevice::NotOpen)
                return isOpen();
            if (!isOpen()) {
                /*open the port*/
                Win_Handle=CreateFileA(port.toAscii(), GENERIC_READ|GENERIC_WRITE,
                                      FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, dwFlagsAndAttributes, NULL);
                if (Win_Handle!=INVALID_HANDLE_VALUE) {
           QIODevice::open(mode);   //将Open函数提到此处,保证调用setBaudRate函数时isOpen返回true
        /*configure port settings*/ GetCommConfig(Win_Handle, &Win_CommConfig, &confSize); GetCommState(Win_Handle, &(Win_CommConfig.dcb)); /*set up parameters*/ 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; setBaudRate(Settings.BaudRate); setDataBits(Settings.DataBits); setStopBits(Settings.StopBits); setParity(Settings.Parity); setFlowControl(Settings.FlowControl); setTimeout(Settings.Timeout_Millisec); SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); //init event driven approach if (queryMode() == QextSerialBase::EventDriven) { Win_CommTimeouts.ReadIntervalTimeout = MAXDWORD; Win_CommTimeouts.ReadTotalTimeoutMultiplier = 0; Win_CommTimeouts.ReadTotalTimeoutConstant = 0; Win_CommTimeouts.WriteTotalTimeoutMultiplier = 0; Win_CommTimeouts.WriteTotalTimeoutConstant = 0; SetCommTimeouts(Win_Handle, &Win_CommTimeouts); if (!SetCommMask( Win_Handle, EV_TXEMPTY | EV_RXCHAR | EV_DSR)) { qWarning("Failed to set Comm Mask. Error code: %ld", GetLastError()); UNLOCK_MUTEX(); return false; } overlapThread->start(); } } } else { UNLOCK_MUTEX(); return false; } UNLOCK_MUTEX(); return isOpen(); }


        这样就解决了调用open函数后,串口没有按照实际参数初始化的问题;