收到部分串行消息

时间:2019-04-29 07:52:24

标签: c++ qt serial-port

我尝试从设备接收串行消息,似乎在串行缓冲区中出现了1个,2个或更多字符后,readyRead()信号被激活。

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{

ui->setupUi(this);

timerTx = new QTimer(this);
timerTx->setInterval(100);

timer.start();
serialRx = new QSerialPort(this);

serialRx->setPortName("COM5"); 
serialRx->setBaudRate(QSerialPort::Baud9600);
serialRx->setParity(QSerialPort::NoParity);
serialRx->setDataBits(QSerialPort::Data8);
serialRx->setStopBits(QSerialPort::OneStop);
serialRx->setFlowControl(QSerialPort::NoFlowControl);

serialTx = new QSerialPort(this);

serialTx->setPortName("COM3"); 
serialTx->setBaudRate(QSerialPort::Baud9600);
serialTx->setParity(QSerialPort::NoParity);
serialTx->setDataBits(QSerialPort::Data8);
serialTx->setStopBits(QSerialPort::OneStop);
serialTx->setFlowControl(QSerialPort::NoFlowControl);

connect(serialRx, SIGNAL(readyRead()), this, SLOT(serialReceive()));
connect(timerTx, SIGNAL(timeout()), this, SLOT(serialSend()));
connect(ui->pushButton, SIGNAL(clicked()), timerTx, SLOT(start()));

}

void MainWindow::serialReceive()
{
QByteArray baRx, num, numOfMs;

qint64 time_ms;
baRx = serialRx -> readAll();

qDebug() << baRx;

time_ms = timer.elapsed();

counterRecDev++;
num = QByteArray::number(counterRecDev);
numOfMs = QByteArray::number(time_ms);

ui->receiveWindow->insertPlainText(num + "\t" + baRx + " \t " + numOfMs + 
"\n" );
ui->receiveWindow -> moveCursor(QTextCursor::End);
}

我通过串行端口发送“ @ Test $”消息,但收到以下消息: “ @” “ T” “美东时间” “%” 其他时间: “ @” “ T” “ es” “ t” “%”

能告诉我如何解决吗?也许问题是我使用readyRead()信号?

最好的国王。

2 个答案:

答案 0 :(得分:0)

使用readyRead()可以,但是在处理代码之前,您需要在代码中检查是否已收到所有预期数据。 通常,这是通过在消息中包含开始和停止字符并在处理之前检查接收到的数据是否包含两者来完成的(看来您已经在使用“ @”和“ $”了。)并且,由于从QSerialPort读取将清除其缓冲区,您还需要在代码中缓冲接收到的数据,直到准备好对其进行处理为止。 您可以执行以下操作:

CONFIG +=separate_debug_info

答案 1 :(得分:0)

QSerialPort在通过多个readyRead信号接收消息时遇到了问题。拥有一个累积缓冲区可能对您有用,但您将需要开始或结束标识符。