串口是在QT中比较常用的一个类,通常也会有这样或者那样的问题,比如说串口的配置问题,我明明在引用了QSerialPort但是为什么不能用呢?等等。
今天要分享的问题就如标题所言,在使用QSerialPort类读取串口消息时,有时候会出现接收不全的现象,针对这个问题进行的解决。
通常情况下大家使用串口接收消息是这样做的
QSerialPort *m_serialport = new QSerialPort();
connect(m_serialport, &QSerialPort::readyRead, this, &BllProjecr::ReadData);
void BllProject::ReadData()
{
QString str;
QByteArray buffer = m_serialport->readAll();
str += buffer;
//然后把str拿去解析。
}
串口传输数据有时候会有延迟 。
比如说串口本来该传的数据是“Vete is so Cool\r”,但是呢,由于传输延迟问题可能就是分两次传的该信息 得到的就是“Vete is”和“ so Cool\r”。对于串口回传信息的解析造成一点困扰。
所以呢就要想办法解决这个问题。这里给出的解决方案是利用QTimer定时器来进行读取。
QTimer *m_timer = new QTimer();
QSerialPort *m_serialport =new QSerialPort();
QByteArray m_buffer;
connect(m_serialport ,&QSerialport::readyRead,this,&BllProject::bufferData);
connect(m_timer,&QTimer::timeout,this,&BllProject::ReadData);
void BllProject::bufferData()
{
m_timer->start(50);
m_buffer.append(m_serialport->readAll());
}
void BllProject::ReadData()
{
m_timer->stop();
// 把m_buffer 拿去解析。
m_buffer.clear();
}
上面这个方法就是针对此问题的改进,给信息来一个50ms的缓冲时间,消除串口数据传输的时间差,这样就可以收到一次下发指令之后串口返回的完整数据了。
————————————————
版权声明:本文为CSDN博主「Vete.」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45013621/article/details/125939331