Serial1 code - port from Arduino - "invalid conversion..." error


Hey guys,

I’m trying to port Arduino code to my Particle Photon in the cloud IDE. The code communicates with a sensor over UART. And I’m in way over my head here… but I fell like this is probably a pretty easy fix if you’re actually a programmer. I am not.

Here’s the link to the Adafruit tutorial:

I get the following error on compile:

pm25.ino:73:26: invalid conversion from 'uint8_t* {aka unsigned char*}' to 'char*' [-fpermissive]

This is line 73:

 s->readBytes(buffer, 32); 

Here’s the code, I’ve indicated the offending line:

// On Leonardo/Micro or others with hardware serial, use those!
// uncomment this line:
#define pmsSerial Serial1

// For UNO and others without hardware serial, we must use software serial...
// pin #2 is IN from sensor (TX pin on sensor), leave pin #3 disconnected
// comment these two lines if using hardware serial
//#include <SoftwareSerial.h>
//SoftwareSerial pmsSerial(2, 3);

void setup() {
  // our debugging output

  // sensor baud rate is 9600

struct pms5003data {
  uint16_t framelen;
  uint16_t pm10_standard, pm25_standard, pm100_standard;
  uint16_t pm10_env, pm25_env, pm100_env;
  uint16_t particles_03um, particles_05um, particles_10um, particles_25um, particles_50um, particles_100um;
  uint16_t unused;
  uint16_t checksum;

struct pms5003data data;
void loop() {
  if (readPMSdata(&pmsSerial)) {
    // reading data was successful!
    Serial.println("Concentration Units (standard)");
    Serial.print("PM 1.0: "); Serial.print(data.pm10_standard);
    Serial.print("\t\tPM 2.5: "); Serial.print(data.pm25_standard);
    Serial.print("\t\tPM 10: "); Serial.println(data.pm100_standard);
    Serial.println("Concentration Units (environmental)");
    Serial.print("PM 1.0: "); Serial.print(data.pm10_env);
    Serial.print("\t\tPM 2.5: "); Serial.print(data.pm25_env);
    Serial.print("\t\tPM 10: "); Serial.println(data.pm100_env);
    Serial.print("Particles > 0.3um / 0.1L air:"); Serial.println(data.particles_03um);
    Serial.print("Particles > 0.5um / 0.1L air:"); Serial.println(data.particles_05um);
    Serial.print("Particles > 1.0um / 0.1L air:"); Serial.println(data.particles_10um);
    Serial.print("Particles > 2.5um / 0.1L air:"); Serial.println(data.particles_25um);
    Serial.print("Particles > 5.0um / 0.1L air:"); Serial.println(data.particles_50um);
    Serial.print("Particles > 50 um / 0.1L air:"); Serial.println(data.particles_100um);

boolean readPMSdata(Stream *s) {
  if (! s->available()) {
    return false;
  // Read a byte at a time until we get to the special '0x42' start-byte
  if (s->peek() != 0x42) {
    return false;

  // Now read all 32 bytes
  if (s->available() < 32) {
    return false;
  uint8_t buffer[32];    
  uint16_t sum = 0;
  s->readBytes(buffer, 32); // <----------------------------  this is the error line 

  // get checksum ready
  for (uint8_t i=0; i<30; i++) {
    sum += buffer[i];

  /* debugging
  for (uint8_t i=2; i<32; i++) {
    Serial.print("0x"); Serial.print(buffer[i], HEX); Serial.print(", ");
  // The data comes in endian'd, this solves it so it works on all platforms
  uint16_t buffer_u16[15];
  for (uint8_t i=0; i<15; i++) {
    buffer_u16[i] = buffer[2 + i*2 + 1];
    buffer_u16[i] += (buffer[2 + i*2] << 8);

  // put it into a nice struct :)
  memcpy((void *)&data, (void *)buffer_u16, 30);

  if (sum != data.checksum) {
    Serial.println("Checksum failure");
    return false;
  // success!
  return true;


Could you make buffer[32] a char instead of a uint8_t? That’s what the error is complaining about. There may be more fixes necessary…


Was encountering the same issue ! Works. Thanks :slight_smile:


nrobinson2000’s answer is the correct one. There is no uint8_t overload for Stream::readBytes(), which is where the serial port read comes from. It must be a char, not uint8_t.

size_t readBytes( char *buffer, size_t length);


Yepp forgot to submit edited comment :wink: