diff --git a/linux/uart/UartComIF.cpp b/linux/uart/UartComIF.cpp index eb12dee..c84affa 100644 --- a/linux/uart/UartComIF.cpp +++ b/linux/uart/UartComIF.cpp @@ -79,6 +79,7 @@ int UartComIF::configureUartPort(UartCookie* uartCookie) { setStopBitOptions(&options, uartCookie); setDatasizeOptions(&options, uartCookie); setFixedOptions(&options); + setUartMode(&options, *uartCookie); if(uartCookie->getInputShouldBeFlushed()) { tcflush(fd, TCIFLUSH); } @@ -403,13 +404,13 @@ ReturnValue_t UartComIF::handleNoncanonicalRead(UartCookie &uartCookie, UartDevi return RETURN_FAILED; } else if (bytesRead != static_cast(requestLen)) { - sif::debug << "UartComIF::requestReceiveMessage: Only read " << bytesRead << - " of " << requestLen << " bytes" << std::endl; - return RETURN_FAILED; - } - else { - iter->second.replyLen = bytesRead; + if(uartCookie.isReplySizeFixed()) { + sif::warning << "UartComIF::requestReceiveMessage: Only read " << bytesRead << + " of " << requestLen << " bytes" << std::endl; + return RETURN_FAILED; + } } + iter->second.replyLen = bytesRead; return HasReturnvaluesIF::RETURN_OK; } diff --git a/linux/uart/UartCookie.cpp b/linux/uart/UartCookie.cpp index bfd815e..2e9cede 100644 --- a/linux/uart/UartCookie.cpp +++ b/linux/uart/UartCookie.cpp @@ -87,3 +87,11 @@ bool UartCookie::getInputShouldBeFlushed() { object_id_t UartCookie::getHandlerId() const { return this->handlerId; } + +void UartCookie::setNoFixedSizeReply() { + replySizeFixed = false; +} + +bool UartCookie::isReplySizeFixed() { + return replySizeFixed; +} diff --git a/linux/uart/UartCookie.h b/linux/uart/UartCookie.h index 69f59a5..faf95d5 100644 --- a/linux/uart/UartCookie.h +++ b/linux/uart/UartCookie.h @@ -95,6 +95,14 @@ public: void setTwoStopBits(); void setOneStopBit(); + /** + * Calling this function prevents the UartComIF to return failed if not all requested bytes + * could be read. This is required by a device handler when the size of a reply is not known. + */ + void setNoFixedSizeReply(); + + bool isReplySizeFixed(); + private: const object_id_t handlerId; @@ -107,6 +115,7 @@ private: uint8_t bitsPerWord = 8; uint8_t readCycles = 1; StopBits stopBits = StopBits::ONE_STOP_BIT; + bool replySizeFixed = true; }; #endif