помогите с передачей указателя
- Войдите на сайт для отправки комментариев
Пнд, 25/04/2016 - 13:03
пишу класс для 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; }
Так в чём проблема? Bus.Date() - возвращает целое число, в Bus::send требует указателя в качесвте параметра. Вот и ругается. Чего Вы хотите-то?
Так в чём проблема? Bus.Date() - возвращает целое число, в Bus::send требует указателя в качесвте параметра. Вот и ругается. Чего Вы хотите-то?
а как правильно написать Bus.Date() что бы она возвращала указатель?
то-же ругается...
может вот так? с явными приведением типа ???
то-же ругается...
Ах, ну, да, там же массив (кстати, впредь Вы говорите как именно ругается).
Тогда вот так:
Так лучше, явным преобразованием не злоупотребляйте, часто оно лишь скрывает ошибку, а не устраняет её.
А с какого возвращаем uint16_t *, если буфер описан как uint8_t Data[...]? Не проще вернуть реальный тип (uint8_t *), нежели uint16_t *? Во всяком случае это кошерней будет.
А с какого возвращаем uint16_t *, если буфер описан как uint8_t Data[...]?
Ой, блин, а я и внимания не обратил :)