Có cách nào để gửi tín hiệu hoặc bất kỳ cách nào khác để biết cáp USB nối tiếp đã được rút phích cắm chưa, sử dụng Qt?Gửi tín hiệu khi cáp nối tiếp USB được rút phích cắm
Trả lời
Bạn có thể sử dụng tín hiệu error
của lớp QSerialPort trong phần bổ trợ QtSerialPort. Xem chi tiết về điều đó trong tài liệu của chúng tôi.
http://qt-project.org/doc/qt-5.1/qtserialport/qserialport.html#error-prop
Bạn sẽ cần phải viết những dòng này về cơ bản:
connect(mySerialPort, SIGNAL(error(QSerialPort::SerialPortError)), this,
SLOT(handleError(QSerialPort::SerialPortError)));
...
void MyClass::handleError(QSerialPort::SerialPortError error)
{
if (error == QSerialPort::ResourceError) {
QMessageBox::critical(this, tr("Critical Error"), serial->errorString());
closeSerialPort();
}
}
QtSerialPort thể được cài đặt một cách dễ dàng với Qt 5.1 < như các gói được phân phối. Tuy nhiên, chúng tôi đã đảm bảo QtSerialPort hoạt động với các phiên bản trước, bao gồm Qt 4.8.X. Ở đây bạn có thể tìm thấy các hướng dẫn cho Qt 4 để có được cài đặt này dành cho bạn:
git clone [email protected]: qt/qtserialport.git
cd qtserialport
qmake
make
sudo make install.
Sau đó, bạn sẽ cần những dòng sau trong file dự án qmake của bạn nếu bạn tình cờ sử dụng qmake:
Qt 5: QT += serialport
Qt 4: COMFIG += serialport
Sử dụng QSerialPortInfo
sẽ đạt được kết quả:
bool MyClass::checkPort()
{
QSerialPortInfo *portInfo = new QSerialPortInfo(ui->serialDevice->currentText());
// ui->serialDevice being a combobox of available serial ports
if (portInfo->isValid())
{
return true;
}
else
{
return false;
}
}
isValid()
là bây giờ đã lỗi thời. isBusy()
có thể được sử dụng thay vì nó sẽ trả lại true
khi bạn đã mở cổng và false
khi cổng không còn ở đó nữa (và bạn vẫn mở nó). Đây cũng là trường hợp khi availablePorts()
tiếp tục trả lại cổng không tồn tại, nhưng đã mở, vì bạn đang giữ cổng trong danh sách bằng cách mở nó.
Cuối cùng đã kết hợp một giải pháp. Tôi thực sự đã kết thúc bằng cách sử dụng 'QSerialPortInfo' để xác thực một cổng trước khi sử dụng nó. –
Bạn đã chỉ cho tôi đúng hướng. Tôi chỉ cần một cái gì đó để xác nhận rằng cổng nối tiếp đã thực sự được cắm vào trước khi nó cố gắng làm bất cứ điều gì với một cổng mở. Tôi đã làm một cái gì đó hơi khác nhau mà làm việc cho những gì tôi đang làm. –
Chính xác * là * một 'ResourceError' là gì? Tôi thỉnh thoảng nhìn thấy nó ở giữa một số giao tiếp cổng nối tiếp, nhưng tôi vẫn có thể gửi và nhận một số dữ liệu trên cổng. (Lớp giao tiếp của tôi bắt đầu hoạt động kém, nhưng dường như nó không bị hỏng hoàn toàn - một số gói hợp lệ vẫn tiếp tục.) –