помогите с передачей указателя

vde69
Offline
Зарегистрирован: 10.01.2016

пишу класс для RS485, вроде все меня устраивает, единственное  это я запутался с передачей указателя на буфер...


//#include <busrs485.h>
BusRS485 Bus(0, 0, 2); // this is master and RS-232 or USB-FTDI

void setup() {
  Bus.begin( 19200 );                      // baud-rate at 19200
  Bus.attachInPackInterrupt(BusInPack);    // подключим процедуру для обработки полученых пакетов
}

void loop() {
  Bus.poll(); // вызов процедур чтения порта
}

// процедура вызывается при получении валидного пакета
void BusInPack (){
  // тут делаем, что нам надо при получении пакета
  // например перешлем его другому адресату
  if (Bus.Id_Destination() == 0) {
    Bus.send(22,             // ID получателя
             Bus.Type(),     // тип пакета
             Bus.Func(),     // номер функции
             Bus.SizeDate(), // размер дополнительных данных
             Bus.Date())     // !!!!!!!! invalid conversion from 'uint16_t' to 'uint16_t*' !!!!!!!
  }
}

вот урезаный код класса

 


// описание пакета, данные передаются и принимаются именно в такой последовательности
typedef struct {
  uint8_t Id_Destination;   // ID получателя пакета
  uint8_t Id_Source;        // ID отправителя пакета
  uint8_t Type;             // Тип пакета
  uint8_t Func;             // Номер команды определяет тип дополнительных данных и правила их обработки 
  uint8_t SizeDate;         // Размер дополнительных данных пакета
  uint8_t xor_Data;         // xor (контроль четности) дополнительных данных пакета
  uint8_t xor_Head;         // xor (контроль четности) заголовка, служит для определения корректности заголовка и выделения кадра из потока данных
  uint8_t Data[MAX_BUFFER]; // дополнительные данные
} 
BusRS485_Pack;

volatile static voidFuncPtr _InPack;

class BusRS485 {
private:
  HardwareSerial *port;       // указатель на Serial class 
  uint8_t Id;                 // 0=master, 1..246=slave, 247=резерв
  uint8_t ControlPin;         // номер пина контроля RS-485 
  BusRS485_Pack InPack;       // входящий пакет
  uint8_t FInPack;            // флаг входящего пакета, 0-ждем заголовок, 1-ждем дополнительные данные, 2-пакет загружен валиден, 3-пакет загружен, но не валиден
  
  void init(uint8_t Id, uint8_t PortNum, uint8_t ControlPin);

public:
  BusRS485(uint8_t Id, uint8_t PortNum, uint8_t ControlPin);
  
  uint8_t Id_Destination (void);
  uint8_t Id_Source (void);
  uint8_t Type (void);
  uint8_t Func (void);
  uint8_t SizeDate (void);
  uint16_t Date (void);
  
  void begin(long Speed);
  void attachInPackInterrupt(void (*)());  
  void poll();         // процедура запуска обработки получения данных
  void on();           // включение шина + COM порт
  void off();          // выключение шины (только COM порт)
  void send(int8_t,    // ID получателя
            int8_t,    // тип пакета
            int8_t,    // номер функции
            int8_t,    // размер дополнительных данных
            uint16_t *); // указатель на буфер дополнительных данных 
};

uint16_t BusRS485::Date (){
  return *InPack.Data;
}


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

Так в чём проблема? Bus.Date() - возвращает целое число, в Bus::send требует указателя в качесвте параметра. Вот и ругается. Чего Вы хотите-то?

vde69
Offline
Зарегистрирован: 10.01.2016

ЕвгенийП пишет:

Так в чём проблема? Bus.Date() - возвращает целое число, в Bus::send требует указателя в качесвте параметра. Вот и ругается. Чего Вы хотите-то?

а как правильно написать Bus.Date() что бы она возвращала указатель?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
uint16_t * BusRS485::Date(void) {
  return  InPack.Data;
}

 

vde69
Offline
Зарегистрирован: 10.01.2016

ЕвгенийП пишет:

uint16_t * BusRS485::Date(void) {
  return  InPack.Data;
}

то-же ругается...

может вот так? с явными приведением типа ???

class BusRS485 {
private:
  HardwareSerial *port;       // указатель на Serial class 
  uint8_t Id;                 // 0=master, 1..246=slave, 247=резерв
  uint8_t ControlPin;         // номер пина контроля RS-485 
  BusRS485_Pack InPack;       // входящий пакет
  uint8_t FInPack;            // флаг входящего пакета, 0-ждем заголовок, 1-ждем дополнительные данные, 2-пакет загружен валиден, 3-пакет загружен, но не валиден
  
  void init(uint8_t Id, uint8_t PortNum, uint8_t ControlPin);
public:
  BusRS485(uint8_t Id, uint8_t PortNum, uint8_t ControlPin);
  
  uint8_t Id_Destination (void);
  uint8_t Id_Source (void);
  uint8_t Type (void);
  uint8_t Func (void);
  uint8_t SizeDate (void);
  uint16_t *Date (void);
.....
.....
.....


uint16_t *BusRS485::Date (){
  return (uint16_t *)InPack.Data;
}
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vde69 пишет:

то-же ругается...

Ах, ну, да, там же массив (кстати, впредь Вы говорите как именно ругается).

Тогда вот так:

uint16_t * BusRS485::Date(void) {
  return  &(InPack.Data[0]);
}

Так лучше, явным преобразованием не злоупотребляйте, часто оно лишь скрывает ошибку, а не устраняет её.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

А с какого возвращаем uint16_t *, если буфер описан как uint8_t Data[...]? Не проще вернуть реальный тип (uint8_t *), нежели uint16_t *? Во всяком случае это кошерней будет.

 

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

kisoft пишет:

А с какого возвращаем uint16_t *, если буфер описан как uint8_t Data[...]? 

Ой, блин, а я и внимания не обратил :)