4

I am using Arduino Uno and my question is when data is coming on Rx pin and at that time our program is not checking Serial.available()

Then after some time the program will check Serial.available(). Can we read data? Does it get stored in memory?

If stored how to remove that?

Is the answer the same for Software.Serial()?

7

Yes. The serial port uses a ring buffer (also known as a circular buffer) for storing the incoming data until you want it. That buffer is 16 bytes in size on the smaller Arduinos and 64 bytes in size on the larger one. A similar ring buffer is used to store transmitted data until the port is ready to transmit it in the background.

  • What happens if the buffer is full and my PC writes an extra character? Does the PC block until there is buffer space, is an old character dropped or is the next character dropped? – Kolban Jun 19 '15 at 12:55
  • 2
    The next (incoming) character is dropped. – Majenko Jun 19 '15 at 13:17
  • Note that when the IDE is on a Raspbian, HardwareSerial.cpp is located at /usr/share/arduino/hardware/arduino/cores/arduino - go into HardwareSerial.cpp and look at where it detects it has more than 1000 bytes of memory (The Rpi3 has 2048) and that is where the ring buffer setting is 64. I haven't found any need to expand it, but it can be done. – SDsolar Aug 22 '17 at 9:13
  • Only if you installed it through apt - which generally installs an ancient (1.0.6 IIRC) version. Sensible people download the tar file from Arduino's website. – Majenko Aug 22 '17 at 9:14
  • I used sudo aptitude install arduino months ago and it is version 2:1.0.5 - and it works great. Since it installed it never occurred to me to look elsewhere. (Except on Windows, of course). – SDsolar Aug 22 '17 at 9:16
2

Yes. The receive ring buffer is 64 bytes and will discard anything past that until the program reads them out of the buffer.

But be careful: In serial monitor, any number of bytes more than 64 and ending with Enter will give you Serial.available==63 at the Arduino - and no \n at the end. This is important especially if you are using readline() in Python.

However, when NOT in the serial monitor, you can actually get the result Serial.available==64 and use Serial.read() to get them in sequence. No \n is required.

So be careful debugging in the serial monitor when it comes to buffer size and newlines. It is subtly different when programs are talking vs the serial monitor.

Most important difference is that a program can send a single byte and continue. Serial monitor will send a single character, but is blocked until you press newline to get it to transmit. Yet serial monitor does not send the newline character.


Simple scenario: You want the Arduino to respond to a single-byte command code send via the serial cable from a Raspbian system running a Python data logging program based on something the Arduino reads or by time of day.

You need to trigger the Arduino to take some action as a result.

So on the Arduino you want to first clear the receive buffer by simply reading it out like so:

Arduino code to read a single-character command:

byte ch;
void setup() {
  Serial.begin(9600));
  while (Serial.available>1) ch = ser.read();
}
void loop {
  if (Serial.Available==1 && Serial.read()=='X') {
     .....respond to the X command....
  }
  else 
     ....etc...
  delay(60000);
}

Note that when a Rpi Python program is sitting there waiting for linein=ser.readline() the Arduino transmit buffer size is not relevant. Python collects each byte as it comes in until the \n then returns the string to linein. The line can be very long. I have tested it to 100 bytes.


Software.Serial acts exactly the same way.

  • When you start the Python program it will do a ser=open("/dev/ttyUSB0",9600) to communicate with the Arduino, which causes the Arduino to reset just like starting the serial monitor does. It is good practice to run the above setup code to clear the Arduino's receive buffer so you know you have an empty channel both ways. – SDsolar Aug 24 '17 at 23:20

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.