summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Shienkov <denis.shienkov@gmail.com>2013-06-06 19:42:10 +0400
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-06-06 20:39:14 +0200
commit2bcac223e64599eb74889975053f6547000b13cb (patch)
treee0486ba96f6028c7c04921f2f3921fce893cc4c9
parentf30159132c2c486508d227fc7d5615e032df6f68 (diff)
downloadqtserialport-2bcac223e64599eb74889975053f6547000b13cb.tar.gz
Windows: Fix false ResourceError triggering for CDC ACM devices
When transmitted data to the USB serial port of the class CDC ACM, is triggered an unexpected TXEMPTY event, which we didn't add to a mask of events in SetCommMask(). In this case handler processCompletionRoutine() interpreted it as ResourceError. This DCD ACM devices over USB connection using the Microsoft USB serial driver (usbser.sys). Thus, allegedly, this behavior identical for all standard CDC ACM devices on Windows. Solution - check on unexpected EV_TXEMPTY flag and immediately return true from processCompletionRoutine(). Thanks to Josh Handley. Task-number: QTPLAYGROUND-22 Change-Id: Iac3eccc79e243e5bbf1a34cd44458c9ad265a5db Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com> Reviewed-by: Laszlo Papp <lpapp@kde.org>
-rw-r--r--src/serialport/qserialport_win.cpp11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/serialport/qserialport_win.cpp b/src/serialport/qserialport_win.cpp
index bbc3e8c..1be0991 100644
--- a/src/serialport/qserialport_win.cpp
+++ b/src/serialport/qserialport_win.cpp
@@ -146,8 +146,15 @@ public:
// Check for unexpected event. This event triggered when pulled previously
// opened device from the system, when opened as for not to read and not to
// write options and so forth.
- if ((triggeredEventMask == 0)
- || ((originalEventMask & triggeredEventMask) == 0)) {
+ if (triggeredEventMask == 0)
+ error = true;
+
+ // Workaround for standard CDC ACM serial ports, for which triggered an
+ // unexpected event EV_TXEMPTY at data transmission.
+ if ((originalEventMask & triggeredEventMask) == 0) {
+ if (triggeredEventMask == EV_TXEMPTY) // it is not error
+ return true;
+
error = true;
}