При чтении с последовательного порта нужно самому разрезать «поток» на «сообщения». Вы не должны делать никаких предположений о времени ваших данных, чтобы быть надежными. «разделители» пакетов.
Класс декодера обычно имеет внутренний буфер и может выглядеть так:
class Decoder : public QObject
{
Q_OBJECT
signals:
void messsageReceived(QByteArray message);
public:
void decode(const QByteArray& bytes)
{
for (char c : bytes)
{
if (c == '$')
{
emit messsageReceived(m_buffer);
m_buffer.clear();
}
else
{
m_buffer.append(c);
}
}
}
private:
QByteArray m_buffer;
};
Также обычно нет гарантии, что вы начнете чтение в начало пакета. Первое чтение может произойти в середине пакета, поэтому большинство протоколов используют последовательность «Старт» и «Стоп», или вам следует отбросить первый пакет, если вы не можете проверить его согласованность. В приведенном выше фрагменте первый пакет не обрабатывается.
Кроме того, последовательные порты не гарантируют передачу байтов без ошибок по линии, поэтому обязательно наличие механизма проверки, если данные разумны, например как контрольную сумму (т.е. CR C). Если некоторые данные повреждены, пакет следует отбросить, и, возможно, необходимо установить механизм на более высоком уровне, чтобы пакет был повторно передан (при необходимости).