Использую QextSerialPort для работы с COM портом.
Есть клсс PortListener у него есть
такой слот
C++ (Qt)
void PortListener::onReadyRead()
{
emit DataRead(port->readAll());
}
Который связан таким образом с QextSerialPort.
C++ (Qt)
connect(port/*QextSerialPort*/, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
Также генерирует сигнал DataRead собственно с данными полученными по COM порту.
На другом концу весит некий девайс с которым нужно общаться по определенному протоколу.
А теперь собственно вопрос.
Как лучше всего(и правильнее) реализовать взаимодействие с ним.
Щас у меня так сделано(скорее всего это очень криво)
C++ (Qt)
void MainWindow::on_Sync_clicked()
{
ui->Sync->setEnabled(false);
PortSettings comPortSettings;
comPortSettings.BaudRate=BAUD9600;
comPortSettings.DataBits=DATA_8;
comPortSettings.FlowControl=FLOW_OFF;
comPortSettings.Parity=PAR_NONE;
comPortSettings.StopBits=STOP_1;
listener->open(ui->comPorts->currentText(),comPortSettings);
listener->SendCommand(QByteArray(512,0x00));
}
void MainWindow::DataRead(const QByteArray& data) // слот которые соединен с сигналом DataRead у PortListener
{
qDebug(data);
QByteArray buf=data.toHex();
switch(state)
{
case NOTSYNCKED:
{
if(buf.contains("0d0a3e")) {
state=SYNCKED;
listener->SendCommand(QByteArray::fromHex("4200c20100"));
Sleep(300);
listener->setBaudRate(BAUD115200);
listener->SendCommand(QByteArray::fromHex("0d"));
}
break;
}
case SYNCKED:{
if(buf.contains("0d0a3e")) {
state=READY;
SendBinary("fw.bin");
Run();
}
}
default:
break;
}
}
Что хотелось бы, чтобы была возможность и асинхронно работать и при этом оставить возможность синхронной работы.
например чтобы можно было сделать вот так(как еще один вариант)
C++ (Qt)
void MainWindow::on_Sync_clicked()
{
ui->Sync->setEnabled(false);
PortSettings comPortSettings;
comPortSettings.BaudRate=BAUD9600;
comPortSettings.DataBits=DATA_8;
comPortSettings.FlowControl=FLOW_OFF;
comPortSettings.Parity=PAR_NONE;
comPortSettings.StopBits=STOP_1;
listener->open(ui->comPorts->currentText(),comPortSettings);
listener->SendCommand(QByteArray(512,0x00));
QEventLoop eventLoop;
connect( listener->port,SIGNAL(onReadyRead()),&eventLoop, SLOT(quit()));
eventLoop.exec();
listener->SendCommand(QByteArray::fromHex("4200c20100"));
Sleep(300);
listener->setBaudRate(BAUD115200);
listener->SendCommand(QByteArray::fromHex("0d"));
}