📄 posix_qextserialport.cpp
字号:
/*!\fn int Posix_QextSerialPort::ungetch(int)This function is included to implement the full QIODevice interface, and currently has no purpose within this class. This function is meaningless on an unbuffered device and currentlyonly prints a warning message to that effect.*/int Posix_QextSerialPort::ungetch(int) { /*meaningless on unbuffered sequential device - return error and print a warning*/ TTY_WARNING("Posix_QextSerialPort: ungetch() called on an unbuffered sequential device - operation is meaningless"); return -1;}/*!\fn void Posix_QextSerialPort::setFlowControl(FlowType flow, bool force=false)Sets the flow control used by the port. Possible values of flow are:\verbatim FLOW_OFF No flow control FLOW_HARDWARE Hardware (RTS/CTS) flow control FLOW_XONXOFF Software (XON/XOFF) flow control\endverbatim\noteFLOW_HARDWARE may not be supported on all versions of UNIX. In cases where it is unsupported, FLOW_HARDWARE is the same as FLOW_OFF.*/void Posix_QextSerialPort::setFlowControl(FlowType flow) { LOCK_MUTEX(); if (Settings.FlowControl!=flow) { Settings.FlowControl=flow; } if (portOpen) { switch(flow) { /*no flow control*/ case FLOW_OFF: Posix_CommConfig.c_cflag&=(~CRTSCTS); Posix_CommConfig.c_iflag&=(~(IXON|IXOFF|IXANY)); tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); break; /*software (XON/XOFF) flow control*/ case FLOW_XONXOFF: Posix_CommConfig.c_cflag&=(~CRTSCTS); Posix_CommConfig.c_iflag|=(IXON|IXOFF|IXANY); tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); break; case FLOW_HARDWARE: Posix_CommConfig.c_cflag|=CRTSCTS; Posix_CommConfig.c_iflag&=(~(IXON|IXOFF|IXANY)); tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); break; } } UNLOCK_MUTEX();}/*!\fn void Posix_QextSerialPort::setParity(ParityType parity)Sets the parity associated with the serial port. The possible values of parity are:\verbatim PAR_SPACE Space Parity PAR_MARK Mark Parity PAR_NONE No Parity PAR_EVEN Even Parity PAR_ODD Odd Parity\endverbatim\noteThis function is subject to the following limitations:\parPOSIX systems do not support mark parity.\parPOSIX systems support space parity only if tricked into doing so, and only with fewer than 8 data bits. Use space parity very carefully with POSIX systems.*/void Posix_QextSerialPort::setParity(ParityType parity) { LOCK_MUTEX(); if (Settings.Parity!=parity) { if (parity==PAR_MARK || (parity==PAR_SPACE && Settings.DataBits==DATA_8)) { } else { Settings.Parity=parity; } } if (portOpen) { switch (parity) { /*space parity*/ case PAR_SPACE: if (Settings.DataBits==DATA_8) { TTY_PORTABILITY_WARNING("Posix_QextSerialPort: Space parity is only supported in POSIX with 7 or fewer data bits"); } else { /*space parity not directly supported - add an extra data bit to simulate it*/ Posix_CommConfig.c_cflag&=~(PARENB|CSIZE); switch(Settings.DataBits) { case DATA_5: Settings.DataBits=DATA_6; Posix_CommConfig.c_cflag|=CS6; break; case DATA_6: Settings.DataBits=DATA_7; Posix_CommConfig.c_cflag|=CS7; break; case DATA_7: Settings.DataBits=DATA_8; Posix_CommConfig.c_cflag|=CS8; break; case DATA_8: break; } tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); } break; /*mark parity - WINDOWS ONLY*/ case PAR_MARK: TTY_WARNING("Posix_QextSerialPort: Mark parity is not supported by POSIX."); break; /*no parity*/ case PAR_NONE: Posix_CommConfig.c_cflag&=(~PARENB); tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); break; /*even parity*/ case PAR_EVEN: Posix_CommConfig.c_cflag&=(~PARODD); Posix_CommConfig.c_cflag|=PARENB; tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); break; /*odd parity*/ case PAR_ODD: Posix_CommConfig.c_cflag|=(PARENB|PARODD); tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); break; } } UNLOCK_MUTEX();} /*!\fn void Posix_QextSerialPort::setDataBits(DataBitsType dataBits)Sets the number of data bits used by the serial port. Possible values of dataBits are:\verbatim DATA_5 5 data bits DATA_6 6 data bits DATA_7 7 data bits DATA_8 8 data bits\endverbatim\note This function is subject to the following restrictions:\par 5 data bits cannot be used with 2 stop bits.\par 8 data bits cannot be used with space parity on POSIX systems.*/void Posix_QextSerialPort::setDataBits(DataBitsType dataBits) { LOCK_MUTEX(); if (Settings.DataBits!=dataBits) { if ((Settings.StopBits==STOP_2 && dataBits==DATA_5) || (Settings.StopBits==STOP_1_5 && dataBits!=DATA_5) || (Settings.Parity==PAR_SPACE && dataBits==DATA_8)) { } else { Settings.DataBits=dataBits; } } if (portOpen) { switch(dataBits) { /*5 data bits*/ case DATA_5: if (Settings.StopBits==STOP_2) { TTY_WARNING("Posix_QextSerialPort: 5 Data bits cannot be used with 2 stop bits."); } else { Settings.DataBits=dataBits; Posix_CommConfig.c_cflag&=(~CSIZE); Posix_CommConfig.c_cflag|=CS5; tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); } break; /*6 data bits*/ case DATA_6: if (Settings.StopBits==STOP_1_5) { TTY_WARNING("Posix_QextSerialPort: 6 Data bits cannot be used with 1.5 stop bits."); } else { Settings.DataBits=dataBits; Posix_CommConfig.c_cflag&=(~CSIZE); Posix_CommConfig.c_cflag|=CS6; tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); } break; /*7 data bits*/ case DATA_7: if (Settings.StopBits==STOP_1_5) { TTY_WARNING("Posix_QextSerialPort: 7 Data bits cannot be used with 1.5 stop bits."); } else { Settings.DataBits=dataBits; Posix_CommConfig.c_cflag&=(~CSIZE); Posix_CommConfig.c_cflag|=CS7; tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); } break; /*8 data bits*/ case DATA_8: if (Settings.StopBits==STOP_1_5) { TTY_WARNING("Posix_QextSerialPort: 8 Data bits cannot be used with 1.5 stop bits."); } else { Settings.DataBits=dataBits; Posix_CommConfig.c_cflag&=(~CSIZE); Posix_CommConfig.c_cflag|=CS8; tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); } break; } } UNLOCK_MUTEX();}/*!\fn void Posix_QextSerialPort::setStopBits(StopBitsType stopBits)Sets the number of stop bits used by the serial port. Possible values of stopBits are:\verbatim STOP_1 1 stop bit STOP_1_5 1.5 stop bits STOP_2 2 stop bits\endverbatim\note This function is subject to the following restrictions:\par 2 stop bits cannot be used with 5 data bits.\par POSIX does not support 1.5 stop bits.*/void Posix_QextSerialPort::setStopBits(StopBitsType stopBits) { LOCK_MUTEX(); if (Settings.StopBits!=stopBits) { if ((Settings.DataBits==DATA_5 && stopBits==STOP_2) || stopBits==STOP_1_5) {} else { Settings.StopBits=stopBits; } } if (portOpen) { switch (stopBits) { /*one stop bit*/ case STOP_1: Settings.StopBits=stopBits; Posix_CommConfig.c_cflag&=(~CSTOPB); tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); break; /*1.5 stop bits*/ case STOP_1_5: TTY_WARNING("Posix_QextSerialPort: 1.5 stop bit operation is not supported by POSIX."); break; /*two stop bits*/ case STOP_2: if (Settings.DataBits==DATA_5) { TTY_WARNING("Posix_QextSerialPort: 2 stop bits cannot be used with 5 data bits"); } else { Settings.StopBits=stopBits; Posix_CommConfig.c_cflag|=CSTOPB; tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); } break; } } UNLOCK_MUTEX();}/*!\fn void Posix_QextSerialPort::setBaudRate(BaudRateType baudRate)Sets the baud rate of the serial port. Note that not all rates are applicable on all platforms. The following table shows translations of the various baud rate constants on Windows(including NT/2000) and POSIX platforms. Speeds marked with an *are speeds that are usable on both Windows and POSIX. \noteBAUD76800 may not be supported on all POSIX systems. SGI/IRIX systems do not support BAUD1800.\verbatim RATE Windows Speed POSIX Speed ----------- ------------- ----------- BAUD50 110 50 BAUD75 110 75 *BAUD110 110 110 BAUD134 110 134.5 BAUD150 110 150 BAUD200 110 200 *BAUD300 300 300 *BAUD600 600 600 *BAUD1200 1200 1200 BAUD1800 1200 1800 *BAUD2400 2400 2400 *BAUD4800 4800 4800 *BAUD9600 9600 9600 BAUD14400 14400 9600 *BAUD19200 19200 19200 *BAUD38400 38400 38400 BAUD56000 56000 38400 *BAUD57600 57600 57600 BAUD76800 57600 76800 *BAUD115200 115200 115200 BAUD128000 128000 115200 BAUD256000 256000 115200\endverbatim*/void Posix_QextSerialPort::setBaudRate(BaudRateType baudRate) { LOCK_MUTEX(); if (Settings.BaudRate!=baudRate) { switch (baudRate) { case BAUD14400: Settings.BaudRate=BAUD9600; break; case BAUD56000: Settings.BaudRate=BAUD38400; break; case BAUD76800:#ifndef B76800 Settings.BaudRate=BAUD57600;#else Settings.BaudRate=baudRate;#endif break; case BAUD128000: case BAUD256000: Settings.BaudRate=BAUD115200; break; default: Settings.BaudRate=baudRate; break; } } if (portOpen) { switch (baudRate) { /*50 baud*/ case BAUD50: TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 50 baud operation.");#ifdef CBAUD Posix_CommConfig.c_cflag&=(~CBAUD); Posix_CommConfig.c_cflag|=B50;#else cfsetispeed(&Posix_CommConfig, B50); cfsetospeed(&Posix_CommConfig, B50);#endif break; /*75 baud*/ case BAUD75: TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 75 baud operation.");#ifdef CBAUD Posix_CommConfig.c_cflag&=(~CBAUD);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -