serial.write and serial.println

I have a rather long and complicated code and part of the code which produces the output is:

void loop()
{
  unsigned char ADC_value;
  unsigned char first_byte = 0;
  
  if(conv_complete)
  {
    if(first_sample)
    {
      first_sample = 0;
      Serial.write(first_byte);
    }
    else
    {
      ADC_value = ADCH;
      Serial.write(ADC_value);
    }
    conv_complete = 0;
  }
}

From my understanding, serial.write writes binary data to the serial port and serial.print prints data to the serial port as human-readable ASCII text. In my code, I am suppose to get 128 samples or 128 bytes in a read out period. This is when serial.write is used. If I changed the serial.write command to serial.println, it prints around 40 integer values each read out period. The image is a sample of the output in the serial monitor.
I am puzzled on the output difference between serial.write and serial.println. Why has the total samples been reduced from 128 bytes to 40 integer values when using serial.println? Did serial.println grouped 3 bytes and convert them into 3 ASCII text?
Is there a way where I can view what has been written with serial.write?

Count the number of bytes in your output they will be just about the same! After all Serial can only go so fast!

Mark

Yes, the number of byte are about the same. But I'm still confused why does serial.println() grouped 3 bytes instead of 4 or 5 bytes? :~

How many chars to print the value 1, how many to print the value 21, how many to print the value 234?

All serial can is print a fixed number of bytes/chars in a given time 123 takes 3 times as long as 1.

Mark

Serial.println() adds a carriage return and line feed at the end. Serial.write() and Serial.print() don't.

...R

Serial.write() comes in 3 flavors

1)    virtual size_t write(uint8_t) ;  // write one byte
2)    virtual size_t write(const char *str);  // write a zero terminated char array
3)    virtual size_t write(const uint8_t *buffer, size_t size);  // write size bytes from byte array

These are the lower level primitives and the Serial.print(all types) uses these write functions to implement their functionality.
In fact (2) and (3) uses (1) under the hood.

so Serial.write(byte) is the "lowest" level function and it is the function that talks to the object specific output code (call it driver) either a Serial port or a LCD or 7segment or disk.

In practice the write functions are often used to write binary data where the print functions are often used for human readability.