У меня есть собственный сигнальный слот в Qt C ++, в котором я хочу хранить данные, полученные от последовательного порта (QSerialPort), для отображения данных с 25 различных датчиков, которые есть во встроенной системе. Значения для моих датчиков колеблются от 5900 до 7200, поэтому я хотел послать различное письмо в виде символа (в диапазоне от a до y, 25 букв) между каждым значением датчика, чтобы моя программа Qt могла сказать, какие данные датчика получены следующими, затем со стоп-байтом, который будет универсальным для моих 25 датчиков.
void MainWindow::serialReceived() // runs individually for almost every byte
{
QByteArray ba = serial->readAll();
qDebug() << ba.size();
}
на данный момент я использую функцию readAll (), и большую часть времени эта функция слота (serialReceived ()) вызывается достаточно часто, так что за один раз принимается только 1 символ, поэтому Я могу проверить букву, обозначающую датчик, затем при следующем вызове функции я могу проверить крайний левый номер данных датчика и т. Д. c, пока не достигну 4-го числа и затем байта остановки, прежде чем процесс будет повторен.
Проблема в том, что иногда он получает больше байта за раз, поэтому, если в моей базе данных содержится более одного значения, я не знаю, как можно было бы проверить наличие отдельных полученных байтов (например, : я получил письмо, за которым следуют 2 первых числа следующего значения датчика ??).
Это то, что мне удалось сделать до сих пор, но это не работает, поскольку у меня возникает проблема, как только я читаю более 1 байта одновременно в своей функции слота:
void MainWindow::serialReceived() // runs individually for almost every byte
{
static char stepFlag = 0;
QByteArray ba = serial->readAll();
qDebug() << ba.size(); //receives 1 byte and
QString s;
s = QString::number(stepFlag), qDebug() <<"step: "<< s;
qDebug() <<"ba: " << ba;
if (ba == "<") stepFlag = 1, s = QString::number(stepFlag), qDebug() << s;
s = QString::number(currentSensorValue), qDebug() << s;
switch (stepFlag) {
case 0:
qDebug() << "starts";
if (ba == "<")
stepFlag = 1;
break;
case 1:
ID = ba.toInt();
qDebug() << ID;
stepFlag = 2;
break;
case 2:
stepFlag++;
currentSensorValue = ba.toInt()*1000; // first char is the 1st number of data (representing thousands)
break;
case 3:
stepFlag++;
currentSensorValue += ba.toInt()*100;
break;
case 4:
stepFlag++;
currentSensorValue += ba.toInt()*10;
break;
case 5:
stepFlag++;
currentSensorValue += ba.toInt();
break;
case 6:
//qDebug() << "a" << currentSensorValue;
if (ba.toInt() == 'r')
{
switch (ID)
{
case 'a':
ui->RX0TX0_LCD->display(currentSensorValue);
qDebug() << "a" << currentSensorValue;
break;
case 'b':
qDebug() << "b" << currentSensorValue;
break;
//This switch would go on for all of the 25 letters (sensors)
default:
break;
}
ID = 0;
}
if (ba.toInt() == 'n')
{
stepFlag = 0;
}
break;
default:
break;
}
}
В общем, моя проблема в том, как я могу читать по 1 байту за раз из QserialPort, чтобы эта проблема больше не возникала? Я также не уверен, является ли мой метод получения символов очень эффективным. Спасибо!