You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
265 lines
6.9 KiB
265 lines
6.9 KiB
/* |
|
* Unofficial Qt Serial Port Library |
|
* |
|
* Copyright (c) 2010 Inbiza Systems Inc. All rights reserved. |
|
* |
|
* This program is free software: you can redistribute it and/or modify it |
|
* under the terms of the GNU Lesser General Public License as published by the |
|
* Free Software Foundation, either version 3 of the License, or (at your |
|
* option) any later version. |
|
* |
|
* This program is distributed in the hope that it will be useful, but WITHOUT |
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
|
* more details. |
|
* |
|
* You should have received a copy of the GNU Lesser General Public License |
|
* along with this program. If not, see <http://www.gnu.org/licenses/> |
|
* |
|
* author labs@inbiza.com |
|
* @brief Declares QPortSettings class that is required to set the port attributes. |
|
*/ |
|
|
|
#ifndef TNX_QSERIALPORTSETTINGS_H__ |
|
#define TNX_QSERIALPORTSETTINGS_H__ |
|
|
|
#include <QString> |
|
#include "qserialport_export.h" |
|
|
|
#ifdef TNX_POSIX_SERIAL_PORT |
|
#undef TNX_POSIX_SERIAL_PORT |
|
#endif |
|
#ifdef TNX_WINDOWS_SERIAL_PORT |
|
#undef TNX_WINDOWS_SERIAL_PORT |
|
#endif |
|
|
|
#if defined(Q_OS_UNIX) || defined(Q_OS_LINUX) || defined(Q_OS_DARWIN) |
|
#define TNX_POSIX_SERIAL_PORT |
|
#endif |
|
#if defined(Q_OS_WIN32) || defined(Q_OS_WINCE) |
|
#include <windows.h> |
|
#define TNX_WINDOWS_SERIAL_PORT |
|
#endif |
|
|
|
namespace TNX { |
|
|
|
enum ChangeApplyTypes { AllAppTy, PortAttrOnlyAppTy, CommTimeoutsOnlyAppTy }; |
|
|
|
/** |
|
* Communication timeout values for Win32/CE and Posix platforms. |
|
* @see www.unixwiz.net/techtips/termios-vmin-vtime.html |
|
*/ |
|
struct CommTimeouts { |
|
#ifdef TNX_WINDOWS_SERIAL_PORT |
|
typedef DWORD commt_t; |
|
static const DWORD NoTimeout = MAXDWORD; |
|
#else |
|
typedef quint8 commt_t; |
|
static const qint8 NoTimeout = -1; |
|
#endif |
|
|
|
// Win32 only section |
|
commt_t Win32ReadIntervalTimeout; ///< Maximum time between read chars. Win32 only. |
|
commt_t Win32ReadTotalTimeoutMultiplier; ///< Multiplier of characters. Win32 only. |
|
commt_t Win32ReadTotalTimeoutConstant; ///< Constant in milliseconds. Win32 only. |
|
commt_t Win32WriteTotalTimeoutMultiplier; ///< Multiplier of characters. Win32 only. |
|
commt_t Win32WriteTotalTimeoutConstant; ///< Constant in milliseconds. Win32 only. |
|
|
|
// Posix only section |
|
commt_t PosixVTIME; ///< Read timeout. Posix only. |
|
commt_t PosixVMIN; ///< Minimum number of bytes before returning from |
|
///< read operation. Posix only. |
|
CommTimeouts() |
|
: Win32ReadIntervalTimeout(NoTimeout), Win32ReadTotalTimeoutMultiplier(0), Win32ReadTotalTimeoutConstant(0), |
|
Win32WriteTotalTimeoutMultiplier(25), Win32WriteTotalTimeoutConstant(250), |
|
PosixVTIME(0), PosixVMIN(1) |
|
{ |
|
} |
|
}; |
|
|
|
/** |
|
* Wrapper class for serial port settings. |
|
*/ |
|
class TONIX_EXPORT QPortSettings |
|
{ |
|
public: |
|
enum BaudRate { |
|
BAUDR_UNKNOWN = 0, |
|
#ifdef TNX_POSIX_SERIAL_PORT |
|
BAUDR_50, |
|
BAUDR_75, |
|
BAUDR_134, |
|
BAUDR_150, |
|
BAUDR_200, |
|
BAUDR_1800, |
|
//BAUDR_76800, |
|
#endif |
|
#ifdef Q_OS_LINUX |
|
BAUDR_230400, |
|
BAUDR_460800, |
|
BAUDR_500000, |
|
BAUDR_576000, |
|
#endif |
|
#ifdef TNX_WINDOWS_SERIAL_PORT |
|
BAUDR_14400, |
|
BAUDR_56000, |
|
BAUDR_128000, |
|
BAUDR_230400, |
|
BAUDR_256000, |
|
BAUDR_460800, |
|
#endif |
|
// baud rates supported by all OSs |
|
BAUDR_110, |
|
BAUDR_300, |
|
BAUDR_600, |
|
BAUDR_1200, |
|
BAUDR_2400, |
|
BAUDR_4800, |
|
BAUDR_9600, |
|
BAUDR_19200, |
|
BAUDR_38400, |
|
BAUDR_57600, |
|
BAUDR_115200, |
|
BAUDR_921600 |
|
}; |
|
|
|
enum DataBits { |
|
DB_5, // simulated in POSIX |
|
DB_6, |
|
DB_7, |
|
DB_8, |
|
DB_UNKNOWN |
|
}; |
|
|
|
enum Parity { |
|
PAR_NONE, |
|
PAR_ODD, |
|
PAR_EVEN, |
|
#ifdef TNX_WINDOWS_SERIAL_PORT |
|
PAR_MARK, |
|
#endif |
|
PAR_SPACE, // simulated in POSIX |
|
PAR_UNKNOWN |
|
}; |
|
|
|
enum StopBits { |
|
STOP_1, |
|
#ifdef TNX_WINDOWS_SERIAL_PORT |
|
STOP_1_5, |
|
#endif |
|
STOP_2, |
|
STOP_UNKNOWN |
|
}; |
|
|
|
enum FlowControl { |
|
FLOW_OFF, |
|
FLOW_HARDWARE, |
|
FLOW_XONXOFF, |
|
FLOW_UNKNOWN |
|
}; |
|
|
|
QPortSettings(); |
|
QPortSettings(const QString &settings); |
|
|
|
// port configuration methods |
|
|
|
bool set(const QString &settings); |
|
|
|
inline BaudRate baudRate() const { |
|
return baudRate_; |
|
} |
|
void setBaudRate(BaudRate baudRate) { |
|
baudRate_ = baudRate; |
|
|
|
switch ( baudRate_ ) { |
|
#ifdef TNX_POSIX_SERIAL_PORT |
|
case BAUDR_50: baudRateInt_=50; break; |
|
case BAUDR_75: baudRateInt_=75; break; |
|
case BAUDR_134: baudRateInt_=134; break; |
|
case BAUDR_150: baudRateInt_=150; break; |
|
case BAUDR_200: baudRateInt_=200; break; |
|
case BAUDR_1800: baudRateInt_=1800; break; |
|
//case 76800: baudRateInt_=76800; break; |
|
#endif |
|
#ifdef TNX_WINDOWS_SERIAL_PORT |
|
case BAUDR_14400: baudRateInt_=14400; break; |
|
case BAUDR_56000: baudRateInt_=56000; break; |
|
case BAUDR_128000: baudRateInt_=128000; break; |
|
case BAUDR_256000: baudRateInt_=256000; break; |
|
case BAUDR_230400: baudRateInt_=230400; break; |
|
case BAUDR_460800: baudRateInt_=460800; break; |
|
#endif |
|
#if defined(Q_OS_LINUX) |
|
case BAUDR_230400: baudRateInt_=230400; break; |
|
case BAUDR_460800: baudRateInt_=460800; break; |
|
case BAUDR_500000: baudRateInt_=500000; break; |
|
case BAUDR_576000: baudRateInt_=576000; break; |
|
#endif |
|
// baud rates supported by all platforms |
|
case BAUDR_110: baudRateInt_=110; break; |
|
case BAUDR_300: baudRateInt_=300; break; |
|
case BAUDR_600: baudRateInt_=600; break; |
|
case BAUDR_1200: baudRateInt_=1200; break; |
|
case BAUDR_2400: baudRateInt_=2400; break; |
|
case BAUDR_4800: baudRateInt_=4800; break; |
|
case BAUDR_9600: baudRateInt_=9600; break; |
|
case BAUDR_19200: baudRateInt_=19200; break; |
|
case BAUDR_38400: baudRateInt_=38400; break; |
|
case BAUDR_57600: baudRateInt_=57600; break; |
|
case BAUDR_115200: baudRateInt_=115200; break; |
|
case BAUDR_921600: baudRateInt_=921600; break; |
|
default: |
|
baudRateInt_ = 0; // unknown baudrate |
|
} |
|
} |
|
|
|
inline Parity parity() const { |
|
return parity_; |
|
} |
|
inline void setParity(Parity parity) { |
|
parity_ = parity; |
|
} |
|
|
|
inline StopBits stopBits() const { |
|
return stopBits_; |
|
} |
|
inline void setStopBits(StopBits stopBits) { |
|
stopBits_ = stopBits; |
|
} |
|
|
|
inline DataBits dataBits() const { |
|
return dataBits_; |
|
} |
|
inline void setDataBits(DataBits dataBits) { |
|
dataBits_ = dataBits; |
|
} |
|
|
|
inline FlowControl flowControl() const { |
|
return flowControl_; |
|
} |
|
inline void setFlowControl(FlowControl flowControl) { |
|
flowControl_ = flowControl; |
|
} |
|
|
|
QString toString() const; |
|
|
|
// helper methods to configure port settings |
|
private: |
|
static BaudRate baudRateFromInt(int baud, bool &ok); |
|
static DataBits dataBitsFromString(const QString &databits, bool &ok); |
|
static Parity parityFromString(const QString &parity, bool &ok); |
|
static StopBits stopBitsFromString(const QString &stopbits, bool &ok); |
|
static FlowControl flowControlFromString(const QString &flow, bool &ok); |
|
|
|
private: |
|
BaudRate baudRate_; |
|
DataBits dataBits_; |
|
Parity parity_; |
|
StopBits stopBits_; |
|
FlowControl flowControl_; |
|
qint32 baudRateInt_; |
|
}; |
|
|
|
} |
|
|
|
#endif // TNX_QSERIALPORTSETTINGS_H__
|
|
|