我需要通过串口读取ID数据。当我用皮革端口发送ID读取命令时,ID数据来得有点晚。因此,当我尝试分割数据并将其显示在屏幕上时,它会变为空白,应用程序会自行关闭。我怎样才能等到数据进来?
void productDetail::on_pushButton_clicked()
{
QSerialPortInfo info;
QList<QSerialPortInfo> infoList = QSerialPortInfo::availablePorts();
foreach(info, infoList) QTextStream(stdout) << info.portName();
QString curport = info.portName();
serial.begin(curport, 9600, 8, 0, 1, 0, false);
if(serial.isOpen()){
qDebug()<<"serial open";
QString sendWC= "WR+1121"; //Read ID command
serial.send(sendWC);
QString serialID = serial.getString();
serialID = serialID.trimmed();
QStringList buffer_split = serialID.split(",");
ui->IDlabel->setText(buffer_split[2]; //when I write this program closes
}
}
}
错误:QList::operator[]:"中的ASSERT失败;索引超出范围";,
Qt'sQIODevice提供信号readyRead
(https://doc.qt.io/qt-5/qiodevice.html#readyRead)每当有新的数据可用于从设备读取时发出一次。
在productDetail
类构造函数中,将串行端口readyRead
信号连接到插槽。
connect(serial, &QSerialPort::readyRead, this, &productDetail::readData);
定义readData
方法如下:
void productDetail::readData()
{
const QByteArray data = m_serial->readAll();
}
对于串行通信,无法保证您将在一次读取中接收到整个消息数据。我更喜欢将接收到的数据存储在循环缓冲区中,并在单独的插槽中处理循环缓冲区。