实测发现 my_serialPort->readAll();只能通过数组读一次。
void DelosSerialPort::readMyCom()//读取缓冲的数据,每秒读一次
{
//这个判断尤为重要,否则的话直接延时再接收数据,空闲时和会出现高内存占用
if (my_serialPort->bytesAvailable()<=0){return;}
myHelper::Sleep(100);//延时100毫秒保证接收到的是一条完整的数据,而不是脱节的
QByteArray requestData = my_serialPort->readAll();//用requestData存储从串口那读取的数据
if(requestData.length())//如果读取到有数据,就显示出来。
{
//ui->textEdit_read->append(requestData); /*字符串显示*/
if(ui->comboBox_protocol->currentText()=="ASCII")
{
/*将数组转换成字符串很重要 串口不能读两次*/
QString strDisplay=QString::fromLocal8Bit(requestData);
//ui->textEdit_read->append(strDisplay); /*字符串显示*/
/*转换方法一*/
/*
int x= strDisplay.indexOf("X");
int y= strDisplay.indexOf("Y");
int z= strDisplay.indexOf("Z");
int l= strDisplay.length();
qDebug() << QString::number( x);
qDebug() << QString::number( y);
qDebug() << QString::number( z);
qDebug() << QString::number( l);
*/
/*转换方法二*/
QStringList list = strDisplay.split("\n");
if(strDisplay.mid(0,1)!="X")
{
QString strMess = "通讯协议不是ASCII";
ui->label_SetMessage->setText(strMess);
return;
}
}
else if(ui->comboBox_protocol->currentText()=="HEX")
{
QString strDisplay=QString::fromLocal8Bit(requestData);
/*打印16进制数据*/
QString str="";
QString hex=requestData.toHex();
for (int i=0;i<hex.length();i=i+2)
{
str+=hex.mid(i,2)+" ";
}
//ui->textEdit_read->append(str);
qDebug()<<str;
}
}
requestData.clear(); //清除缓冲区
}