Comparing a string literal to a uint8_t

Hello,

I am making a Arduino Rover. The test sketches all work fine. The remote transmits values.

Decoding the value received from the buffer which is a uint8_t, is a problem. I can't compare the string literals to the buffer to know what action to preform.

Is there a way to compare a string literal to a uint8_t?

Rover:

#include <RH_ASK.h>
#ifdef RH_HAVE_HARDWARE_SPI
#include <SPI.h>
#endif

RH_ASK driver;
// RH_ASK driver(2000, 4, 5, 0); // ESP8266 or ESP32: do not use pin 11 or 2
// RH_ASK driver(2000, 3, 4, 0); // ATTiny, RX on D3 (pin 2 on attiny85) TX on D4 (pin 3 on attiny85)

const int in1 = 3;
const int in2 = 4;
const int in3 = 5;
const int in4 = 6;
const int ENA = 2;
const int ENB = 7;

void setup() {
#ifdef RH_HAVE_SERIAL
  Serial.begin(9600);
#endif
  if (!driver.init())
#ifdef RH_HAVE_SERIAL
    Serial.println("init failed");
#else
    ;
#endif

  pinModeSetup();
}

void stopCar() {
  digitalWrite(in1,LOW);      
  digitalWrite(in2,LOW);
  digitalWrite(in3,LOW);      
  digitalWrite(in4,LOW);
  Serial.println("Stop");
}

void foward()
{
  digitalWrite(ENA, HIGH);
  digitalWrite(ENB, HIGH);
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  Serial.println("Forward");
}

void backward()
{
  digitalWrite(ENA, HIGH);
  digitalWrite(ENB, HIGH);
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  Serial.println("Back");
}

void left()
{
  digitalWrite(ENA, HIGH);
  digitalWrite(ENB, HIGH);
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  Serial.println("Left");
}

void right()
{
  digitalWrite(ENA, HIGH);
  digitalWrite(ENB, HIGH);
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  Serial.println("Right");
}

void pinModeSetup() {
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(ENA, OUTPUT);
  pinMode(ENB, OUTPUT);
}


void loop() {
  uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];
  uint8_t buflen = sizeof(buf);

  if (driver.recv(buf, &buflen)) {
    int i;

    if (strcmp((char *)buf, "A0")) {
      stopCar();
    } else if (strcmp((char *)buf, "31")) {
      foward();
    } else if (strcmp((char *)buf, "32")) {
      right();
    } else if (strcmp((char *)buf, "33")) {
      backward();
    } else if (strcmp((char *)buf, "34")) {
      left();
    } else {
      stopCar();
    }

    driver.printBuffer("Got:", buf, buflen);
    Serial.println("");
  }
}

Rover Remote:

#include <RH_ASK.h>
#ifdef RH_HAVE_HARDWARE_SPI
#include <SPI.h>
#endif

RH_ASK driver;
// RH_ASK driver(2000, 4, 5, 0); // ESP8266 or ESP32: do not use pin 11 or 2
// RH_ASK driver(2000, 3, 4, 0); // ATTiny, RX on D3 (pin 2 on attiny85) TX on D4 (pin 3 on attiny85)

char *msg = "0";

void setup() {
  if (!driver.init()) {
    while(1) {;}
  }
  pinModeSetup();
  Serial.begin(9600);
}

void loop() {
  if (digitalRead(2) == LOW) {
    msg = "1";
  } else if (digitalRead(3) == LOW) {
    msg = "2";
  } else if (digitalRead(4) == LOW) {
    msg = "3";
  } else if (digitalRead(5) == LOW) {
    msg = "4";
  } else {
    msg = 0;
  }
  driver.send((uint8_t *)msg, strlen(msg));
  driver.waitPacketSent();
  Serial.println(msg);
}

void pinModeSetup() {
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(4, INPUT);
  pinMode(5, INPUT);
}

Thanks for all the help in advance.

I've changed my code with no success.

#include <RH_ASK.h>
#ifdef RH_HAVE_HARDWARE_SPI
#include <SPI.h>
#endif

RH_ASK driver;
// RH_ASK driver(2000, 4, 5, 0); // ESP8266 or ESP32: do not use pin 11 or 2
// RH_ASK driver(2000, 3, 4, 0); // ATTiny, RX on D3 (pin 2 on attiny85) TX on D4 (pin 3 on attiny85)

const int in1 = 3;
const int in2 = 4;
const int in3 = 5;
const int in4 = 6;
const int ENA = 2;
const int ENB = 7;

void setup() {
#ifdef RH_HAVE_SERIAL
  Serial.begin(9600);
#endif
  if (!driver.init())
#ifdef RH_HAVE_SERIAL
    Serial.println("init failed");
#else
    ;
#endif

  pinModeSetup();
}

void stopCar() {
  digitalWrite(in1,LOW);      
  digitalWrite(in2,LOW);
  digitalWrite(in3,LOW);      
  digitalWrite(in4,LOW);
  Serial.println("Stop");
}

void foward()
{
  digitalWrite(ENA, HIGH);
  digitalWrite(ENB, HIGH);
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  Serial.println("Forward");
}

void backward()
{
  digitalWrite(ENA, HIGH);
  digitalWrite(ENB, HIGH);
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  Serial.println("Back");
}

void left()
{
  digitalWrite(ENA, HIGH);
  digitalWrite(ENB, HIGH);
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  Serial.println("Left");
}

void right()
{
  digitalWrite(ENA, HIGH);
  digitalWrite(ENB, HIGH);
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  Serial.println("Right");
}

void pinModeSetup() {
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(ENA, OUTPUT);
  pinMode(ENB, OUTPUT);
}


void loop() {
  uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];
  uint8_t buflen = sizeof(buf);

  if (driver.recv(buf, &buflen)) {
    int i;

    if (strcmp((char *)buf, "A0") == 0) {
      stopCar();
    } else if (strcmp((char *)buf, "31") == 0) {
      foward();
    } else if (strcmp((char *)buf, "32") == 0) {
      right();
    } else if (strcmp((char *)buf, "33") == 0) {
      backward();
    } else if (strcmp((char *)buf, "34") == 0) {
      left();
    } else {
      stopCar();
    }

    driver.printBuffer("Got:", buf, buflen);
    Serial.println("");
  }
}

This also doesn't work.

#include <RH_ASK.h>
#ifdef RH_HAVE_HARDWARE_SPI
#include <SPI.h>
#endif

RH_ASK driver;
// RH_ASK driver(2000, 4, 5, 0); // ESP8266 or ESP32: do not use pin 11 or 2
// RH_ASK driver(2000, 3, 4, 0); // ATTiny, RX on D3 (pin 2 on attiny85) TX on D4 (pin 3 on attiny85)

const int in1 = 3;
const int in2 = 4;
const int in3 = 5;
const int in4 = 6;
const int ENA = 2;
const int ENB = 7;

void setup() {
#ifdef RH_HAVE_SERIAL
  Serial.begin(9600);
#endif
  if (!driver.init())
#ifdef RH_HAVE_SERIAL
    Serial.println("init failed");
#else
    ;
#endif

  pinModeSetup();
}

void stopCar() {
  digitalWrite(in1,LOW);      
  digitalWrite(in2,LOW);
  digitalWrite(in3,LOW);      
  digitalWrite(in4,LOW);
  Serial.println("Stop");
}

void foward()
{
  digitalWrite(ENA, HIGH);
  digitalWrite(ENB, HIGH);
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  Serial.println("Forward");
}

void backward()
{
  digitalWrite(ENA, HIGH);
  digitalWrite(ENB, HIGH);
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  Serial.println("Back");
}

void left()
{
  digitalWrite(ENA, HIGH);
  digitalWrite(ENB, HIGH);
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  Serial.println("Left");
}

void right()
{
  digitalWrite(ENA, HIGH);
  digitalWrite(ENB, HIGH);
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  Serial.println("Right");
}

void pinModeSetup() {
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(ENA, OUTPUT);
  pinMode(ENB, OUTPUT);
}


void loop() {
  uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];
  uint8_t buflen = sizeof(buf);

  if (driver.recv(buf, &buflen)) {
    int i;

    if (memcmp((char *)buf, "A0", 2) == 0) {
      stopCar();
    } else if (memcmp((char *)buf, "31", 2) == 0) {
      foward();
    } else if (memcmp((char *)buf, "32", 2) == 0) {
      right();
    } else if (memcmp((char *)buf, "33", 2) == 0) {
      backward();
    } else if (memcmp((char *)buf, "34", 2) == 0) {
      left();
    } else {
      stopCar();
    }

    driver.printBuffer("Got:", buf, buflen);
    Serial.println("");
  }
}

Unsigned_Arduino:
Is there a way to compare a string literal to a uint8_t?

A uint8_t represents one byte of data (value 0 to 255). A string literal refers to an arbitrary number of ASCII characters (one character per byte) and a terminating null byte. What, exactly, would such a comparison mean?

Well, the buffer seems to be a uint8_t, so I need to compare that to a list of instruction definitions. (If buf == 1, then go foward)

Here's more unsuccessful code:

#include <RH_ASK.h>
#ifdef RH_HAVE_HARDWARE_SPI
#include <SPI.h>
#endif

RH_ASK driver;
// RH_ASK driver(2000, 4, 5, 0); // ESP8266 or ESP32: do not use pin 11 or 2
// RH_ASK driver(2000, 3, 4, 0); // ATTiny, RX on D3 (pin 2 on attiny85) TX on D4 (pin 3 on attiny85)

const int in1 = 3;
const int in2 = 4;
const int in3 = 5;
const int in4 = 6;
const int ENA = 2;
const int ENB = 7;

void setup() {
#ifdef RH_HAVE_SERIAL
  Serial.begin(9600);
#endif
  if (!driver.init())
#ifdef RH_HAVE_SERIAL
    Serial.println("init failed");
#else
    ;
#endif

  pinModeSetup();
}

void stopCar() {
  digitalWrite(in1,LOW);      
  digitalWrite(in2,LOW);
  digitalWrite(in3,LOW);      
  digitalWrite(in4,LOW);
  Serial.println("Stop");
}

void foward()
{
  digitalWrite(ENA, HIGH);
  digitalWrite(ENB, HIGH);
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  Serial.println("Forward");
}

void backward()
{
  digitalWrite(ENA, HIGH);
  digitalWrite(ENB, HIGH);
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  Serial.println("Back");
}

void left()
{
  digitalWrite(ENA, HIGH);
  digitalWrite(ENB, HIGH);
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  Serial.println("Left");
}

void right()
{
  digitalWrite(ENA, HIGH);
  digitalWrite(ENB, HIGH);
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  Serial.println("Right");
}

void pinModeSetup() {
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  pinMode(ENA, OUTPUT);
  pinMode(ENB, OUTPUT);
}


void loop() {
  uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];
  uint8_t buflen = sizeof(buf);

  if (driver.recv(buf, &buflen)) {
    int i;

    if (memcmp((char *)buf, "A0", buflen) == 0) {
      stopCar();
    } else if (memcmp((char *)buf, "31", buflen) == 0) {
      foward();
    } else if (memcmp((char *)buf, "32", buflen) == 0) {
      right();
    } else if (memcmp((char *)buf, "33", buflen) == 0) {
      backward();
    } else if (memcmp((char *)buf, "34", buflen) == 0) {
      left();
    } else {
      stopCar();
    }

    driver.printBuffer("Got:", buf, buflen);
    Serial.println("");
  }
}