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

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

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

01//#include <busrs485.h>
02BusRS485 Bus(0, 0, 2); // this is master and RS-232 or USB-FTDI
03 
04void setup() {
05  Bus.begin( 19200 );                      // baud-rate at 19200
06  Bus.attachInPackInterrupt(BusInPack);    // подключим процедуру для обработки полученых пакетов
07}
08 
09void loop() {
10  Bus.poll(); // вызов процедур чтения порта
11}
12 
13// процедура вызывается при получении валидного пакета
14void BusInPack (){
15  // тут делаем, что нам надо при получении пакета
16  // например перешлем его другому адресату
17  if (Bus.Id_Destination() == 0) {
18    Bus.send(22,             // ID получателя
19             Bus.Type(),     // тип пакета
20             Bus.Func(),     // номер функции
21             Bus.SizeDate(), // размер дополнительных данных
22             Bus.Date())     // !!!!!!!! invalid conversion from 'uint16_t' to 'uint16_t*' !!!!!!!
23  }
24}

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

 

01// описание пакета, данные передаются и принимаются именно в такой последовательности
02typedef struct {
03  uint8_t Id_Destination;   // ID получателя пакета
04  uint8_t Id_Source;        // ID отправителя пакета
05  uint8_t Type;             // Тип пакета
06  uint8_t Func;             // Номер команды определяет тип дополнительных данных и правила их обработки
07  uint8_t SizeDate;         // Размер дополнительных данных пакета
08  uint8_t xor_Data;         // xor (контроль четности) дополнительных данных пакета
09  uint8_t xor_Head;         // xor (контроль четности) заголовка, служит для определения корректности заголовка и выделения кадра из потока данных
10  uint8_t Data[MAX_BUFFER]; // дополнительные данные
11}
12BusRS485_Pack;
13 
14volatile static voidFuncPtr _InPack;
15 
16class BusRS485 {
17private:
18  HardwareSerial *port;       // указатель на Serial class
19  uint8_t Id;                 // 0=master, 1..246=slave, 247=резерв
20  uint8_t ControlPin;         // номер пина контроля RS-485
21  BusRS485_Pack InPack;       // входящий пакет
22  uint8_t FInPack;            // флаг входящего пакета, 0-ждем заголовок, 1-ждем дополнительные данные, 2-пакет загружен валиден, 3-пакет загружен, но не валиден
23   
24  void init(uint8_t Id, uint8_t PortNum, uint8_t ControlPin);
25 
26public:
27  BusRS485(uint8_t Id, uint8_t PortNum, uint8_t ControlPin);
28   
29  uint8_t Id_Destination (void);
30  uint8_t Id_Source (void);
31  uint8_t Type (void);
32  uint8_t Func (void);
33  uint8_t SizeDate (void);
34  uint16_t Date (void);
35   
36  void begin(long Speed);
37  void attachInPackInterrupt(void (*)()); 
38  void poll();         // процедура запуска обработки получения данных
39  void on();           // включение шина + COM порт
40  void off();          // выключение шины (только COM порт)
41  void send(int8_t,    // ID получателя
42            int8_t,    // тип пакета
43            int8_t,    // номер функции
44            int8_t,    // размер дополнительных данных
45            uint16_t *); // указатель на буфер дополнительных данных
46};
47 
48uint16_t BusRS485::Date (){
49  return *InPack.Data;
50}
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

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

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

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

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

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

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

 

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

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

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

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

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

01class BusRS485 {
02private:
03  HardwareSerial *port;       // указатель на Serial class
04  uint8_t Id;                 // 0=master, 1..246=slave, 247=резерв
05  uint8_t ControlPin;         // номер пина контроля RS-485
06  BusRS485_Pack InPack;       // входящий пакет
07  uint8_t FInPack;            // флаг входящего пакета, 0-ждем заголовок, 1-ждем дополнительные данные, 2-пакет загружен валиден, 3-пакет загружен, но не валиден
08   
09  void init(uint8_t Id, uint8_t PortNum, uint8_t ControlPin);
10public:
11  BusRS485(uint8_t Id, uint8_t PortNum, uint8_t ControlPin);
12   
13  uint8_t Id_Destination (void);
14  uint8_t Id_Source (void);
15  uint8_t Type (void);
16  uint8_t Func (void);
17  uint8_t SizeDate (void);
18  uint16_t *Date (void);
19.....
20.....
21.....
22 
23 
24uint16_t *BusRS485::Date (){
25  return (uint16_t *)InPack.Data;
26}
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vde69 пишет:

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

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

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

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

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

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[...]? 

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