помогите с передачей указателя
- Войдите на сайт для отправки комментариев
Пнд, 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 * BusRS485::Date(void) { return InPack.Data; }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; }то-же ругается...
Ах, ну, да, там же массив (кстати, впредь Вы говорите как именно ругается).
Тогда вот так:
uint16_t * BusRS485::Date(void) { return &(InPack.Data[0]); }Так лучше, явным преобразованием не злоупотребляйте, часто оно лишь скрывает ошибку, а не устраняет её.
А с какого возвращаем uint16_t *, если буфер описан как uint8_t Data[...]? Не проще вернуть реальный тип (uint8_t *), нежели uint16_t *? Во всяком случае это кошерней будет.
А с какого возвращаем uint16_t *, если буфер описан как uint8_t Data[...]?
Ой, блин, а я и внимания не обратил :)