什么是Qt5 serialPort?
虽然现在大多数的家用PC机上已经不提供RS232接口了。但是由于RS232串口操作简单、通讯可靠,在工业领域中仍然有大量的应用。Qt以前的版本中,没有提供官方的对RS232串口的支持,编写串口程序很不方便。现在好了,在 Qt5.1 中提供了QtSerialPort模块,方便编程人员快速的开发应用串口的应用程序。
Qt5 serialPort存在的问题。
在项目中需要编写一个上位机串口接受数据,结果发现接受数据时,使用Qt5serialport会丢失数据。编写程序时参考文章。
http://blog.csdn.net/u014695839/article/details/50611549
然后换用多个版本任然存在此问题。
解决方式。
使用第三方库
qextserialport ,使用这个比较古老的库就不会出现本文所述问题。使用这个库可以参考
http://blog.csdn.net/u010580186/article/details/51595227
这篇文章,这篇文章详细介绍了如何使用。包括加入.h文件,以及加入.cpp文件等。可以先参考第一部来测试是否丢失数据。
如何判断是否丢失数据?
我在上面提到的博文中优化了显示数据,即是可以显示看到是否有数据。数据是否丢失,使用qDebug方法
void MainWindow::readMyCom() //读串口函数
{
// qDebug() << "进入";
if (myCom->bytesAvailable() >= 56)
{
qDebug() << "1";
QByteArray temp = myCom->readAll();
//读取串口缓冲区的所有数据给临时变量temp
ui->textBrowser->insertPlainText(temp);
qDebug() << temp;
//将串口的数据显示在窗口的文本浏览器中
QDataStream out(&temp, QIODevice::ReadWrite); //将str的数据 读到out里面去
// QVector <QString> tempstr;
QString tempstr[112];
// QString buf;
int i = 0;
while (!out.atEnd())
{
qint8 outChar = 0;
out >> outChar; //每次一个字节的填充到 outchar
// qDebug()<<outChar;
// QString str = QString("%1").arg(outChar&0xFF,2,16,QLatin1Char('0')).toUpper();// + QString(" "); //2 字符宽度
// tempstr[i] << str;
tempstr[i] = QString("%1").arg(outChar & 0xFF, 2, 16, QLatin1Char('0')).toUpper();
//qDebug() << "******";
//qDebug() << tempstr[i];
//qDebug() << "******";
if (i<56)
i++;
}
for(int i = 0; i < 96; i++)
qDebug()<<tempstr[i];
}
}
同时还要注意串口是串口几,博文默认的是串口1,但是我的是串口3因此需要改动
myCom = new Win_QextSerialPort("com3", myComSetting, QextSerialBase::EventDriven)