diff options
author | Denis Shienkov <denis.shienkov@gmail.com> | 2013-06-06 19:42:10 +0400 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-06-06 20:39:14 +0200 |
commit | 2bcac223e64599eb74889975053f6547000b13cb (patch) | |
tree | e0486ba96f6028c7c04921f2f3921fce893cc4c9 | |
parent | f30159132c2c486508d227fc7d5615e032df6f68 (diff) | |
download | qtserialport-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.cpp | 11 |
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; } |