处理串口接收多组JSON格式的数据时,可用此方法,当有串口读取信号时,设置定时器读取串口数。当时间完后对数据进行处理。
例:
#include <QTimer>
static int k=0,j=0;
static QTimer *timer = new QTimer();
QByteArray temp_buf; //缓冲区,接收串口数据
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
connect(&serial, &QSerialPort::readyRead, this, &MainWindow::serialPort_readyRead);
connect(timer,SIGNAL(timeout()),this,SLOT(timeUpdate()));
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::serialPort_readyRead()
{
timer->start(100);//启动定时器,接收100毫秒数据(根据情况设定)
temp_buf.append(serial.readAll());
}
void MainWindow::timeUpdate()
{
timer->stop();
if(temp_buf.length()!=0)
{
QString Istr;
Istr=QString::fromLocal8Bit( temp_buf );
temp_buf.clear()
QByteArray Ibuf = Istr.toLatin1();
QList<int> ileft,iright;
for(int i = 0; i <Istr.length(); i++)
{
if(Ibuf[i]=='{')
{
ileft<<i;
j++;
}
if(Ibuf[i]=='}')
{
iright<<i;
k++;
}
}
Ibuf.clear();
ui->recvDate_textEdit->clear();
if(j == k)
{
for(int i = 0; i<k; i++)
{
QString Ijson ;
Ijson = Istr.mid(ileft.at(i),iright.at(i)-ileft.at(i)+1);
ui->recvDate_textEdit->append(Ijson);
}
}
ileft.clear();
iright.clear();
j=0;
k=0;
}