Передать текст внутри структуры
- Войдите на сайт для отправки комментариев
Втр, 22/08/2017 - 22:31
Как передать текст внутри структуры?
Отдельно числа и отдельно только текст - без проблем, а вместе соединить не получается.
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
<< тут пустая строка вместо текста.
вы наверное сглупили . У String нет постояного размера. И да даные String хранятся в куче. Вы переслали указатель. А вот содержимое кучи осталось в передатчике. А в приемнике нет данных из этой кучи.
ладно. Как тогда передать char msg[20]? Ибо на data.msg[] = "Test point"; оно ругается: "expected primary-expression before ']' token"
только массивом с фиксированой длиной. Или надо городить свой передатчик и свой приемник.
//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));только массивом с фиксированой длиной. Или надо городить свой передатчик и свой приемник.
//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 где?
И я не ТС. И это не моя тема.
Посмотрел, но не нашёл. Там только memcpy(data.msg, p, len(p));
Впрочем, не особо-то и хотелось :)