16,816
社区成员




void MainWindow::on_serial_open_clicked()
{
QSerialPort serial;
serial.setPortName(ui->serial_box->currentText());
serial.setBaudRate(ui->bate_box->currentText().toInt());
serial.setDataBits(QSerialPort::Data8);
serial.setParity(QSerialPort::NoParity);
serial.setStopBits(QSerialPort::OneStop);
qDebug() << serial.portName() << serial.baudRate() << endl;
if (serial.open(QIODevice::ReadOnly))
{
qDebug() << "串口打开成功";
if(serial.waitForReadyRead(1000))
{
for(int i = 0; i <= 100; i++)
{
data_efficient = convert_data(serial);
qDebug() << data_efficient;
}
serial.close();
qDebug() << "串口已关闭";
}
else
{
qDebug() << "串口连接超时";
serial.close();
qDebug() << "串口已关闭";
}
}
else
{
qDebug() << "串口打开失败:" << serial.errorString();
}
}
void MainWindow::on_serial_check_clicked()
{
ui->serial_box->clear();
foreach (const QSerialPortInfo &serial_info, QSerialPortInfo::availablePorts())
{
ui->serial_box->addItem(serial_info.portName());
}
}
QList<QString> convert_data(QSerialPort &serial)
{
QList<QString> convert;
for(int i = 0; i <= 32; i++)
{
convert.append(serial.read(1).toHex());
}
return convert;
}
如图,打开串口后原计划接收101个长度为33的QList的数据,但是实际上接收100个字节后就接收不到数据了,将程序改为每次读取1个字节,循环101次也会出现上述问题
已知数据发送设备状态正常,请教各位大神是哪里出现了问题
这受限于你的波特率,正常1 个起始位,8 个数据位,0 个校验位,1 个停止位;要传输一个字节(8 位)的数据,则我应该在总线上产生 10 个电平变换,也就是串行总线上,需要 10 位,才能发送 1 个字节数据。1 秒可以发送 57600 位,那么用 57600 /10 ,就是1秒可以发送 5760个字节数据;你想一次性秒读完所有101*33个字节数据,那么就要修改波特率,或者修改函数成循环读取,直到读取完成所有数据
void MainWindow::on_serial_open_clicked()
{
QSerialPort serial;
serial.setPortName(ui->serial_box->currentText());
serial.setBaudRate(ui->bate_box->currentText().toInt());
serial.setDataBits(QSerialPort::Data8);
serial.setParity(QSerialPort::NoParity);
serial.setStopBits(QSerialPort::OneStop);
qDebug() << serial.portName() << serial.baudRate() << endl;
if (serial.open(QIODevice::ReadOnly))
{
qDebug() << "串口打开成功";
while (1)
{
if (serial.waitForReadyRead(1000))
{
for (int i = 0; i <= 100; i++)
{
data_efficient = convert_data(serial);
qDebug() << data_efficient;
}
serial.close();
qDebug() << "串口已关闭";
break;
}
else
{
qDebug() << "串口连接超时";
serial.close();
qDebug() << "串口已关闭";
break;
}
}
}
else
{
qDebug() << "串口打开失败:" << serial.errorString();
}
}
void MainWindow::on_serial_check_clicked()
{
ui->serial_box->clear();
foreach(const QSerialPortInfo &serial_info, QSerialPortInfo::availablePorts())
{
ui->serial_box->addItem(serial_info.portName());
}
}
QList<QString> convert_data(QSerialPort &serial)
{
QList<QString> convert;
for (int i = 0; i <= 32; i++)
{
convert.append(serial.read(1).toHex());
}
return convert;
}
你的waitForReadyRead只调用了一次,有充分可能循环执行完的时候数据还没接收完
你可以看一下QSerialPort文档里的代码例子,waitForReadyRead是应该要放在循环里的