gpt4 book ai didi

c++ - QtSerialPort 有不可用的数据,仅在 Windows 8 下出现段错误

转载 作者:可可西里 更新时间:2023-11-01 09:20:17 25 4
gpt4 key购买 nike

const QSerialPortInfo* serialPortInfo = nullptr;

bool PortManager::setPort(QString portName) {
const QList<QSerialPortInfo> infoList = QSerialPortInfo::availablePorts();
for (const QSerialPortInfo portInfo : infoList) {
if (portInfo.portName() == portName && serialPortInfo != &portInfo) {
serialPortInfo = &portInfo;
}
}
if (serialPortInfo != nullptr) {
if (portName != "" && serialPortInfo->isValid()) { //segmentation fault
if (serialPort->isOpen()) {
serialPort->close();
}
serialPort = new QSerialPort(*serialPortInfo, this);
if (serialPort->open(QIODevice::ReadWrite)) {
if (serialPort->clear()) {
if (serialPort->setBaudRate(QSerialPort::Baud38400, QSerialPort::AllDirections)
&& serialPort->setFlowControl(QSerialPort::NoFlowControl)
&& serialPort->setParity(QSerialPort::NoParity)) {
isPortSet = true;
}
.
.
.

这是我的代码,可在 Linux 和 Windows 7 上运行。现在我在 Windows 8 上测试它,我在 this->serialPortInfo->isValid()(以及 serialPortInfo 的任何其他函数)上遇到段错误.任何特定 QSerialPortInfo 对象的所有数据都是“不可用的”(如调试器所述),在我看来,我没有使用它们的特权。在 Linux 上,我必须是 uupc(如果我没记错的话)组的成员才能避免出现此类错误,但在 Windows 7 上我不需要做任何事情。我以“管理员身份”运行 Qt Creator,但没有帮助;也许我必须以某种方式告诉它也以管理员身份运行 qmake?但这只是我的猜测,也许原因不同......

最佳答案

问题是这个循环:

for (const QSerialPortInfo portInfo : infoList) {
if (portInfo.portName() == portName && serialPortInfo != &portInfo) {
serialPortInfo = &portInfo;
}
}

变量 portInfo 的范围仅在循环内,并且仅针对当前迭代。一旦循环迭代,该变量就会被破坏。使用指向已破坏对象的指针是 undefined behavior ,以及导致崩溃的可能原因。

关于如何停止它,我的建议是不要使用指针。而是复制结构。

关于c++ - QtSerialPort 有不可用的数据,仅在 Windows 8 下出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24863905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com