Home > OS >  uint8 array passing value fail - only one uint8_t sent
uint8 array passing value fail - only one uint8_t sent

Time:08-03

I try to start a array in the header file

rs485.h

class RS485
{
public:
uint8_t off[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};
void sendmsg(uint8_t* cmd);

};

rs485.cpp

void RS485::sendmsg(uint8_t* cmd)
{
    //digitalWrite(ENTX_PIN, HIGH); // enable to transmit
    Serial.println("sending message------------");

    Serial2.write(cmd[0]);
    Serial.println(cmd[0], HEX);
    Serial2.write(cmd[1]);
    Serial.println(cmd[1], HEX);
    Serial2.write(cmd[2]);
    Serial.println(cmd[2], HEX);
    Serial2.write(cmd[3]);
    Serial.println(cmd[3], HEX);
    Serial2.write(cmd[4]);
    Serial.println(cmd[4], HEX);
    Serial2.write(cmd[5]);
    Serial.println(cmd[5], HEX);
    Serial2.write(cmd[6]);
    Serial.println(cmd[6], HEX);
    Serial2.write(cmd[7]);
    Serial.println(cmd[7], HEX);

    Serial.println("--------------------------");
}

main.cpp


void callback(char *topic, byte *payload, unsigned int length)
{

'''omit'''

  if (cmd)
  {
    Serial.print("cmd: ");
    Serial.println(cmd);
    if (cmd == 700)
    {
      rs485.sendmsg(rs485.off);
    }
    else if (cmd == 701)
    {
      rs485.sendmsg(rs485.on);
    }
'''omit'''
}
'''omit'''

}

complier have an error message of "too many initializer values".

When I try to use

    uint8_t off[8] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};

it build normally. The problem is when in use this variable in main.cpp and pass it to rs485.cpp only one element off[0] is pass normally.

 rs485.sendmsg(rs485.off);

I have use serial print to check all value it can all print out but the rs485 cannot tx all char.

    Serial2.write(cmd[0]);
    Serial.println(cmd[0], HEX);
    Serial2.write(cmd[1]);
    Serial.println(cmd[1], HEX);
    Serial2.write(cmd[2]);
    Serial.println(cmd[2], HEX);
    Serial2.write(cmd[3]);
    Serial.println(cmd[3], HEX);
    Serial2.write(cmd[4]);
    Serial.println(cmd[4], HEX);
    Serial2.write(cmd[5]);
    Serial.println(cmd[5], HEX);
    Serial2.write(cmd[6]);
    Serial.println(cmd[6], HEX);
    Serial2.write(cmd[7]);
    Serial.println(cmd[7], HEX);

Any result for that?

add the wiring

gpio26 -->DE RE
gpio21 -->DI
gpio25 -->RO

CodePudding user response:

A member variable declared as

uint8_t off[] = { ... };

does not become an array with the number of elements in the initializer list, like when you declare a non-member variable. Instead, it then becomes a "flexible array" (a C thing that g enables by default in C ) - and flexible arrays can't have initializers, which is why you get "too many initializer values".

The correct way is therefore to specify the number of elements:

uint8_t off[8] = { ... };

I suggest that you send them all out at once and check how many that are actully written:

size_t written = Serial2.write(cmd, 8);
Serial.println(written);

This should display 8 if the sending code works.

  • Related