qt executable for usage with serial port on Windows and php
-
Hello,
I would like to write a small qt program that will be executed with php exec and will have input arguments byte array that needs to be written to the COM serial port. After the write, i need to read the port. The response i would get from the qt program needs to be transferred to php. So far i have this code:
#include <QCoreApplication> #include "serialportmanager.h" #include "windows.h." int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QByteArray message; message[0] = 0x02; message[1] = 0x01; message[2] = 0x00; message[3] = 0x01; message[4] = 0x01; message[5] = 0x12; message[6] = 0xF6; SerialPortManager spm; spm.openSerialPort(); spm.writeData(message); //spm.readData(); //spm.closeSerialPort(); return a.exec(); } `#ifndef SERIALPORTMANAGER_H #define SERIALPORTMANAGER_H #include <QtCore/QtGlobal> #include <QObject> #include <QtSerialPort/QSerialPort> class SerialPortManager : public QObject { Q_OBJECT public: explicit SerialPortManager(QObject *parent = 0); ~SerialPortManager(); public slots: void openSerialPort(); void closeSerialPort(); //private slots: void writeData(const QByteArray &data); void readData(); void handleError(QSerialPort::SerialPortError error); private: QSerialPort *serial; }; #endif // SERIALPORTMANAGER_H ``
//#include "mainwindow.h" //#include "ui_mainwindow.h" //#include "console.h" //#include "settingsdialog.h" //#include <QMessageBox> //#include <QtSerialPort/QSerialPort> #include "serialportmanager.h" #include <QtSerialPort/QSerialPortInfo> #include <QDebug> SerialPortManager::SerialPortManager(QObject *parent) : QObject(parent) { // ui->setupUi(this); // console = new Console; // console->setEnabled(false); // setCentralWidget(console); serial = new QSerialPort(this); // settings = new SettingsDialog; // ui->actionConnect->setEnabled(true); // ui->actionDisconnect->setEnabled(false); // ui->actionQuit->setEnabled(true); // ui->actionConfigure->setEnabled(true); // initActionsConnections(); connect(serial, SIGNAL(error(QSerialPort::SerialPortError)), this, SLOT(handleError(QSerialPort::SerialPortError))); connect(serial, SIGNAL(readyRead()), this, SLOT(readData())); // connect(console, SIGNAL(getData(QByteArray)), this, SLOT(writeData(QByteArray))); } SerialPortManager::~SerialPortManager() { // delete settings; // delete ui; } void SerialPortManager::openSerialPort() { QSerialPortInfo portToUse; foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { QString s = QObject::tr("Port:") + info.portName() + "\n" + QObject::tr("Location:") + info.systemLocation() + "\n" + QObject::tr("Description:") + info.description() + "\n" + QObject::tr("Manufacturer:") + info.manufacturer() + "\n" + QObject::tr("Serial number:") + info.serialNumber() + "\n" + QObject::tr("Vendor Identifier:") + (info.hasVendorIdentifier() ? QString::number(info.vendorIdentifier(), 16) : QString()) + "\n" + QObject::tr("Product Identifier:") + (info.hasProductIdentifier() ? QString::number(info.productIdentifier(), 16) : QString()) + "\n" + QObject::tr("Busy:") + (info.isBusy() ? QObject::tr("Yes") : QObject::tr("No")) + "\n"; if(!info.isBusy() && (info.portName().contains("COM5") )) portToUse = info; // qDebug() << s; } if(portToUse.isNull() || !portToUse.isValid()) { qDebug() << "port is not valid:" << portToUse.portName(); return; } // SettingsDialog::Settings p = settings->settings(); // Enumerate the serial port // Find one that sounds like Arduino, or the highest one on the list // Open it if it isn't busy serial->setPortName(portToUse.portName()); serial->setBaudRate(QSerialPort::Baud9600); serial->setDataBits(QSerialPort::Data8); serial->setParity(QSerialPort::NoParity); serial->setStopBits(QSerialPort::OneStop); serial->setFlowControl(QSerialPort::NoFlowControl); if (serial->open(QIODevice::ReadWrite)) { // console->setEnabled(true); // console->setLocalEchoEnabled(p.localEchoEnabled); // ui->actionConnect->setEnabled(false); // ui->actionDisconnect->setEnabled(true); // ui->actionConfigure->setEnabled(false); qDebug() << "Connected to" << portToUse.description() << "on" << portToUse.portName(); } else { qCritical() << "Serial Port error:" << serial->errorString(); qDebug() << tr("Open error"); } } void SerialPortManager::closeSerialPort() { serial->close(); // console->setEnabled(false); // ui->actionConnect->setEnabled(true); // ui->actionDisconnect->setEnabled(false); // ui->actionConfigure->setEnabled(true); qDebug() << tr("Disconnected"); } void SerialPortManager::writeData(const QByteArray &data) { serial->write(data); } void SerialPortManager::readData() { QByteArray data = serial->readAll(); // console->putData(data); qDebug() << "UART:" << data; } void SerialPortManager::handleError(QSerialPort::SerialPortError error) { if (error == QSerialPort::ResourceError) { // QMessageBox::critical(this, tr("Critical Error"), serial->errorString()); qCritical() << "Serial Port error:" << serial->errorString(); closeSerialPort(); } } //void SerialPortManager::initActionsConnections() //{ // // connect(ui->actionConnect, SIGNAL(triggered()), this, SLOT(openSerialPort())); // // connect(ui->actionDisconnect, SIGNAL(triggered()), this, SLOT(closeSerialPort())); // // connect(ui->actionQuit, SIGNAL(triggered()), this, SLOT(close())); // // connect(ui->actionConfigure, SIGNAL(triggered()), settings, SLOT(show())); // // connect(ui->actionClear, SIGNAL(triggered()), console, SLOT(clear())); //}
I have established writing and reading to the com port. My question is how to transform this project so it can be executed from comand line with php and can receieve bytes as input arguments and output the result bytes from readAll to php? thanks
-
I wrote a Windows program to extract data from a Serial Port and push it to a PHP web service.
I believe that is how you will have to do it...- Extract SerialData
- Store in whatever struct you want locally
- Call your PHP with the SerialData
My PHP is running as a web service on my WebServer, and the SerialPort application runs on a separate upload server. Works without any issues.
In order to do it all on a single server... say run Apache with PHP AND your SerialPort application on demand on the same server, you should look into the PHP calls to 'exec' or 'shell-exec' and see if they will work for you.
--Sam