Передать текст внутри структуры

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Как передать текст внутри структуры? 

Отдельно числа и отдельно только текст - без проблем, а вместе соединить не получается.

Master:

#include <RS485_non_blocking.h>
#include <SoftwareSerial.h>

#define RS485_RX_PIN          6
#define RS485_TX_PIN          5
SoftwareSerial rs485(RS485_RX_PIN, RS485_TX_PIN);  // receive pin, transmit pin

struct          // структура пакета данных
{
  byte thisDeviceID;
  byte destinationID;
  int  value;
  String msg;
} data;

size_t fWrite(const byte what)
{
  return rs485.write(what); 
}

RS485 network(NULL, NULL, fWrite, 0);

void setup()
{
  Serial.begin(9600);
  rs485.begin(9600); // software serial for talking to other devices
  network.begin(); // initialize the RS485 library
}  // end of setup

void loop()
{
  //const byte msg[] = "Hello world";  // Этот вариант передается корректно. Только почему "byte"?
  //network.sendMsg(msg, sizeof (msg));

  memset(&data, 0, sizeof(data));

  data.thisDeviceID = 3;
  data.destinationID = 0;
  data.value = 8;
  data.msg = "Test point";

  network.sendMsg((byte *) &data, sizeof(data));

  delay (1000);  
}  // end of loop

Slave:

#include <RS485_non_blocking.h>
#include <SoftwareSerial.h>
#define RS485_RX_PIN          6
#define RS485_TX_PIN          5
SoftwareSerial rs485(RS485_RX_PIN, RS485_TX_PIN);  // receive pin, transmit pin

struct          // структура пакета данных
{
  byte thisDeviceID;
  byte destinationID;
  int  value;
  String msg;
} data;


int fAvailable()
{
  return rs485.available();
}


int fRead()
{
  return rs485.read();
}

RS485 network(fRead, fAvailable, NULL, 20);

void setup()
{
  Serial.begin(9600);
  rs485.begin(9600); // software serial for talking to other devices
  network.begin(); // initialize the RS485 library
}  // end of setup

void loop()
{
  if (network.update())
  {
    //  Serial.write(network.getData(), network.getLength());  это работает с byte msg[] = "Hello world"
    //  Serial.println();

    memset(&data, 0, sizeof(data));
    int len = network.getLength();
    if (len > sizeof(data)) len = sizeof(data);
    memcpy(&data, network.getData(), len);

    Serial.println(data.thisDeviceID);
    Serial.println(data.destinationID);
    Serial.println(data.value);
    Serial.println(data.msg);
    Serial.println();
  }
}  // end of loop

Результат:

3

0

8

<< тут пустая строка вместо текста.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

вы наверное сглупили . У String нет постояного размера. И да даные String хранятся в куче. Вы переслали указатель. А вот содержимое кучи осталось в передатчике. А в приемнике нет данных из этой кучи.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

ладно. Как тогда передать char msg[20]? Ибо на data.msg[] = "Test point"; оно ругается: "expected primary-expression before ']' token"

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

только массивом с фиксированой длиной. Или надо городить свой передатчик и свой приемник.

//data.msg[] ="Test point";

struct{
  byte thisDeviceID;
  byte destinationID;
  int  value;
  char msg[20];
} data;

char *p = "Test point";
memcpy(data.msg, p, len(p));

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

qwone пишет:

только массивом с фиксированой длиной. Или надо городить свой передатчик и свой приемник.

//data.msg[] ="Test point";

struct{
  byte thisDeviceID;
  byte destinationID;
  int  value;
  char msg[20];
} data;

char *p = "Test point";
memcpy(data.msg, p, len(p));

 

А функция len где? 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ЕвгенийП пишет:
А функция len где?
Смотрите стоку 11

И я не ТС. И это не моя тема.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Посмотрел, но не нашёл. Там только memcpy(data.msg, p, len(p));

Впрочем, не особо-то и хотелось :)