QT_USE_NAMESPACE int main(int argc, char *argv[]) { QCoreApplication coreApplication(argc, argv); int argumentCount = QCoreApplication::arguments().size(); QStringList argumentList = QCoreApplication::arguments(); QTextStream standardOutput(stdout); if (argumentCount == 1) { standardOutput << QObject::tr("Usage: %1 <serialportname> [baudrate]").arg(argumentList.first()) << endl; return 1; } QSerialPort serialPort; QString serialPortName = argumentList.at(1); serialPort.setPortName(serialPortName); if (!serialPort.open(QIODevice::WriteOnly)) { standardOutput << QObject::tr("Failed to open port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; return 1; } int serialPortBaudRate = (argumentCount > 2) ? argumentList.at(2).toInt() : QSerialPort::Baud9600; if (!serialPort.setBaudRate(serialPortBaudRate)) { standardOutput << QObject::tr("Failed to set 9600 baud for port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; return 1; } if (!serialPort.setDataBits(QSerialPort::Data8)) { standardOutput << QObject::tr("Failed to set 8 data bits for port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; return 1; } if (!serialPort.setParity(QSerialPort::NoParity)) { standardOutput << QObject::tr("Failed to set no parity for port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; return 1; } if (!serialPort.setStopBits(QSerialPort::OneStop)) { standardOutput << QObject::tr("Failed to set 1 stop bit for port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; return 1; } if (!serialPort.setFlowControl(QSerialPort::NoFlowControl)) { standardOutput << QObject::tr("Failed to set no flow control for port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; return 1; } QFile dataFile; if (!dataFile.open(stdin, QIODevice::ReadOnly)) { standardOutput << QObject::tr("Failed to open stdin for reading") << endl; return 1; } QByteArray writeData(dataFile.readAll()); dataFile.close(); if (writeData.isEmpty()) { standardOutput << QObject::tr("Either no data was currently available on the standard input for reading, or an error occurred for port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; return 1; } SerialPortWriter serialPortWriter(&serialPort); serialPortWriter.write(writeData); return coreApplication.exec(); }
QT_USE_NAMESPACE int main(int argc, char *argv[]) { QCoreApplication coreApplication(argc, argv); int argumentCount = QCoreApplication::arguments().size(); QStringList argumentList = QCoreApplication::arguments(); QTextStream standardOutput(stdout); if (argumentCount == 1) { standardOutput << QObject::tr("Usage: %1 <serialportname> [baudrate]").arg(argumentList.first()) << endl; return 1; } QSerialPort serialPort; QString serialPortName = argumentList.at(1); serialPort.setPortName(serialPortName); int serialPortBaudRate = (argumentCount > 2) ? argumentList.at(2).toInt() : QSerialPort::Baud9600; serialPort.setBaudRate(serialPortBaudRate); if (!serialPort.open(QIODevice::WriteOnly)) { standardOutput << QObject::tr("Failed to open port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; return 1; } QFile dataFile; if (!dataFile.open(stdin, QIODevice::ReadOnly)) { standardOutput << QObject::tr("Failed to open stdin for reading") << endl; return 1; } QByteArray writeData(dataFile.readAll()); dataFile.close(); if (writeData.isEmpty()) { standardOutput << QObject::tr("Either no data was currently available on the standard input for reading, or an error occurred for port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; return 1; } qint64 bytesWritten = serialPort.write(writeData); if (bytesWritten == -1) { standardOutput << QObject::tr("Failed to write the data to port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; return 1; } else if (bytesWritten != writeData.size()) { standardOutput << QObject::tr("Failed to write all the data to port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; return 1; } else if (!serialPort.waitForBytesWritten(5000)) { standardOutput << QObject::tr("Operation timed out or an error occurred for port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; return 1; } standardOutput << QObject::tr("Data successfully sent to port %1").arg(serialPortName) << endl; return 0; }
QT_USE_NAMESPACE int main(int argc, char *argv[]) { QCoreApplication coreApplication(argc, argv); int argumentCount = QCoreApplication::arguments().size(); QStringList argumentList = QCoreApplication::arguments(); QTextStream standardOutput(stdout); if (argumentCount == 1) { standardOutput << QObject::tr("Usage: %1 <serialportname> [baudrate]").arg(argumentList.first()) << endl; return 1; } QSerialPort serialPort; QString serialPortName = argumentList.at(1); serialPort.setPortName(serialPortName); int serialPortBaudRate = (argumentCount > 2) ? argumentList.at(2).toInt() : QSerialPort::Baud9600; serialPort.setBaudRate(serialPortBaudRate); if (!serialPort.open(QIODevice::ReadOnly)) { standardOutput << QObject::tr("Failed to open port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; return 1; } SerialPortReader serialPortReader(&serialPort); return coreApplication.exec(); }
void SerialThread::run() { QSerialPort serial; int cr; serial.setPortName(m_portName); if (!serial.setBaudRate(115200)) { qDebug() << "Serial set baud rate failed!"; emit this->serialError(tr("Can't set baud rate for %1, error code %2. %3.") .arg(m_portName).arg(serial.error()).arg(serial.errorString())); return; } if (!serial.setDataBits(QSerialPort::Data8)) { qDebug() << "Serial set data bits failed!"; emit this->serialError(tr("Can't set data bits for %1, error code %2. %3.") .arg(m_portName).arg(serial.error()).arg(serial.errorString())); return; } if (!serial.setParity(QSerialPort::NoParity)) { qDebug() << "Serial set parity failed!"; emit this->serialError(tr("Can't set parity for %1, error code %2. %3.") .arg(m_portName).arg(serial.error()).arg(serial.errorString())); return; } if (!serial.setStopBits(QSerialPort::OneStop)) { qDebug() << "Serial set stop bits failed!"; emit this->serialError(tr("Can't set stop bits for %1, error code %2. %3.") .arg(m_portName).arg(serial.error()).arg(serial.errorString())); return; } if (!serial.setFlowControl(QSerialPort::NoFlowControl)) { qDebug() << "Serial set flow control failed!"; emit this->serialError(tr("Can't set flow control for %1, error code %2. %3.") .arg(m_portName).arg(serial.error()).arg(serial.errorString())); return; } for (cr = 0; cr < m_connectAttempts; cr++) { if (serial.open(QIODevice::ReadWrite)) { break; } sleep(1); qDebug() << "Serial connect retry..."; } if (cr == m_connectAttempts) { qDebug() << "Connection failed!"; emit this->serialError(tr("Can't open %1, error code %2. %3.") .arg(m_portName).arg(serial.error()).arg(serial.errorString())); return; } emit this->serialConnected(); qDebug() << "Serial Thread is ready..."; m_mutex.lock(); /* Unlock resources and wait for the first job. */ m_cond.wait(&m_mutex); m_mutex.unlock(); while (!m_quit) { /* Protect shared resources while thread is working. */ m_mutex.lock(); if (m_txBuf.size() > 0) { qint64 bytesWritten = serial.write(m_txBuf); if (serial.waitForBytesWritten(SERIAL_WRITE_TIMEOUT_MS)) { m_txBuf.remove(0, bytesWritten); } else { qDebug() << "Write request timeout!"; /* Unlock resources and exit. */ m_mutex.unlock(); emit serialTimeout(tr("Write request timeout!")); break; } } if (serial.waitForReadyRead(SERIAL_READ_TIMEOUT_MS)) { m_rxBuf += serial.readAll(); while (serial.waitForReadyRead(SERIAL_READ_TIMEOUT_EXTRA_MS)) { m_rxBuf += serial.readAll(); } if (m_rxBuf.size() >= TELEMETRY_MSG_SIZE_BYTES) { processInputData(); } } else { qDebug() << "Read response timeout!"; /* Unlock resources and exit. */ m_mutex.unlock(); emit serialTimeout(tr("Read response timeout!")); break; } //qDebug() << "Serial Thread is sleeping..."; /* Unlock resources and wait for the next job. */ m_cond.wait(&m_mutex); m_mutex.unlock(); } qDebug() << "Serial Thread is terminating..."; serial.close(); }
QT_USE_NAMESPACE int main(int argc, char *argv[]) { QCoreApplication coreApplication(argc, argv); int argumentCount = QCoreApplication::arguments().size(); QStringList argumentList = QCoreApplication::arguments(); QTextStream standardOutput(stdout); if (argumentCount == 1) { standardOutput << QObject::tr("Usage: %1 <serialportname> [baudrate]").arg(argumentList.first()) << endl; return 1; } QSerialPort serialPort; QString serialPortName = argumentList.at(1); serialPort.setPortName(serialPortName); int serialPortBaudRate = (argumentCount > 2) ? argumentList.at(2).toInt() : QSerialPort::Baud9600; serialPort.setBaudRate(serialPortBaudRate); if (!serialPort.open(QIODevice::ReadOnly)) { standardOutput << QObject::tr("Failed to open port %1, error: %2").arg(serialPortName).arg(serialPort.error()) << endl; return 1; } QByteArray readData = serialPort.readAll(); while (serialPort.waitForReadyRead(5000)) readData.append(serialPort.readAll()); if (serialPort.error() == QSerialPort::ReadError) { standardOutput << QObject::tr("Failed to read from port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl; return 1; } else if (serialPort.error() == QSerialPort::TimeoutError && readData.isEmpty()) { standardOutput << QObject::tr("No data was currently available for reading from port %1").arg(serialPortName) << endl; return 0; } standardOutput << QObject::tr("Data successfully received from port %1").arg(serialPortName) << endl; standardOutput << readData << endl; return 0; }