Skip to content

HardwareSerial::flush() returns immediately if called as Stream*->flush() interface #2369

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Closed
mlaga97 opened this issue May 14, 2024 · 2 comments

Comments

@mlaga97
Copy link

mlaga97 commented May 14, 2024

Please, before reporting any issue

Any questions/feedback/suggestions should be discussed on the stm32duino forum:

⚠ When reporting any issue, please try to provide all relevant information to help on its resolution.

Describe the bug
HardwareSerial::flush() returns early if called via Stream* interface

To Reproduce

const int PIN_EN = PA1;
const int PIN_TX = PA2;
const int PIN_RX = PA3;

HardwareSerial Serial1(PIN_RX, PIN_TX);
Stream* streamTest = &Serial1;

void setup() {
  Serial1.begin(115200);
  pinMode(PIN_EN, OUTPUT);
}

void loop() {
  // Calling directly
  Serial1.print("aaaaaa");

  digitalWrite(PIN_EN, HIGH);
  Serial1.flush();
  digitalWrite(PIN_EN, LOW); // Goes low only after data has been fully transmitted

  delay(1);

  // Calling via generic stream interface
  streamTest->print("bbbbbb");

  digitalWrite(PIN_EN, HIGH);
  streamTest->flush();
  digitalWrite(PIN_EN, LOW); // Goes low immediately

  delay(1);
}

Expected behavior
In the above code, streamTest->flush() should return only once the data has been fully flushed.

Screenshots
Selection_001

Desktop (please complete the following information):

Board (please complete the following information):

  • Name: Generic STM32G030
  • Hardware Revision: N/A
  • Extra hardware used if any: N/A

Additional context
This appears to be a side effect of #2124, as reverting that commit results in the issue going away.

It seems as though the optional parameter is preventing HardwareSerial::flush(uint32_t timeout = 0) from properly overloading Stream::flush(void).

Therefore, another method of resolving is by modifying HardwareSerial.h from

virtual void flush(uint32_t timeout = 0);

to

virtual void flush()
{
  flush(0);
}
virtual void flush(uint32_t timeout);
@mlaga97
Copy link
Author

mlaga97 commented May 14, 2024

Need to search better. #2254

@mlaga97 mlaga97 closed this as completed May 14, 2024
@fpistm
Copy link
Member

fpistm commented May 14, 2024

Hi @mlaga97
No worry, fix will be available within next release in the coming weeks.

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants