From 2bcac223e64599eb74889975053f6547000b13cb Mon Sep 17 00:00:00 2001 From: Denis Shienkov Date: Thu, 6 Jun 2013 19:42:10 +0400 Subject: 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 Reviewed-by: Laszlo Papp --- src/serialport/qserialport_win.cpp | 11 +++++++++-- 1 file 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; } -- cgit v1.2.1 From 58365228b3181ed03188fc8ff56007ea22678bb5 Mon Sep 17 00:00:00 2001 From: Denis Shienkov Date: Fri, 7 Jun 2013 18:56:57 +0400 Subject: Windows: Fix no longer receive data after EV_TXEMPTY triggered for CDC ACM device A previous patch * SHA1 ID: 2bcac223e64599eb74889975053f6547000b13cb introduced a regression: after triggering of EV_TXEMPTY a reception of data is stopped. The reason for this was an immediate return from the handler processCompletionRoutine(). The solution - do not do an immediate return and let to call method startAsyncRead(). Thanks to Dan Task-number: QTPLAYGROUND-22 Change-Id: I1a6b358e6bbaba94527dc9db98a2ab046a8c6f05 Reviewed-by: Sergey Belyashov Reviewed-by: Laszlo Papp --- src/serialport/qserialport_win.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/serialport/qserialport_win.cpp b/src/serialport/qserialport_win.cpp index 1be0991..e8d4d62 100644 --- a/src/serialport/qserialport_win.cpp +++ b/src/serialport/qserialport_win.cpp @@ -152,10 +152,8 @@ public: // 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; + if ((triggeredEventMask & EV_TXEMPTY) == 0) + error = true; } // Start processing a caught error. -- cgit v1.2.1