Есть протокол в котором взаимодействуют компьютер с неким устройством по сети RS-485. Размер запросных сообщений от устройства 16 байт. Первые два байта описывают тип сообщения.
Размер ответных сообщений от компьютера различный, как и в запросном сообщении первые два байта описывают тип сообщения.
Вот примерный класс для обработки полученных сообщений.
#include "opuConnectionRS485.h"
#include <QDebug>
#include "opuRequestMessage.h"
#include <unistd.h>
ConnectionRS485::ConnectionRS485(QString com_portName, int com_baudrate, QObject *parent) :
QObject(parent), portName_(com_portName), baudrate_(com_baudrate)
{
initSettings();
port_->setReadBufferSize(messageLength);
int portState = port_->open(QIODevice::ReadWrite);
if(portState)
{
qDebug()<< "[ConnectionRS485]. Good open port:" << portName_ << "baudrate:" << baudrate_;
connect(port_, SIGNAL(readyRead()), SLOT(getMessage()));
}else{
qDebug()<< "[ConnectionRS485]. Error open port:" << portName_ << "baudrate:" << baudrate_;
}
}
void ConnectionRS485::initSettings()
{
port_ = new QSerialPort;
port_->setPortName(portName_);
port_->setBaudRate(baudrate_);
port_->setDataBits(QSerialPort::Data8);
port_->setParity(QSerialPort::NoParity);
port_->setStopBits(QSerialPort::OneStop);
port_->setFlowControl(QSerialPort::NoFlowControl);
}
void ConnectionRS485::getMessage()
{
QByteArray message;
if(port_->bytesAvailable() >= messageLength)
{
message = port_->read(messageLength);
emit sendMessage(message);
}
}
void ConnectionRS485::changePortSettings(QString port, int baud)
{
qDebug() << "[ConnectionRS485]. Change port setting port:" << port << " baudrate:" << baud;
port_->setPortName(port);
port_->setBaudRate(baud);
port_->setDataBits(QSerialPort::Data8);
port_->setParity(QSerialPort::NoParity);
port_->setStopBits(QSerialPort::OneStop);
port_->setFlowControl(QSerialPort::NoFlowControl);
}
void ConnectionRS485::writeMessage(QByteArray message)
{
port_->write(message);
port_->flush();
}
Когда я напрямую передаю сообщения (тестовое соединение в компьютере из одного порта в другой) все вроде нормально работает. А когда работаю с реальным устройством т.е. компьютер
принимает запросные сообщения от устройства(messageLength == 16 байтов) и посылает на этот запрос ответные сообщения запрашиваемому устройству, тогда порой возникают ошибки. В этой сети иногда
проскальзывают ненужные байты, и тогда принятое сообщение в 16 байт уже имеет другие данные, в следствие чего не могу нормально обработать поступивший запрос и отослать ответное сообщение. Вопрос, как мне
правильно считывать поступающие данные, если в сети иногда возникают другие байты данных. Заранее спасибо.