помогите с передачей указателя
- Войдите на сайт для отправки комментариев
Пнд, 25/04/2016 - 13:03
пишу класс для RS485, вроде все меня устраивает, единственное это я запутался с передачей указателя на буфер...
01 | //#include <busrs485.h> |
02 | BusRS485 Bus(0, 0, 2); // this is master and RS-232 or USB-FTDI |
03 |
04 | void setup () { |
05 | Bus.begin( 19200 ); // baud-rate at 19200 |
06 | Bus.attachInPackInterrupt(BusInPack); // подключим процедуру для обработки полученых пакетов |
07 | } |
08 |
09 | void loop () { |
10 | Bus.poll(); // вызов процедур чтения порта |
11 | } |
12 |
13 | // процедура вызывается при получении валидного пакета |
14 | void 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 | // описание пакета, данные передаются и принимаются именно в такой последовательности |
02 | typedef 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 | } |
12 | BusRS485_Pack; |
13 |
14 | volatile static voidFuncPtr _InPack; |
15 |
16 | class BusRS485 { |
17 | private : |
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 |
26 | public : |
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 |
48 | uint16_t BusRS485::Date (){ |
49 | return *InPack.Data; |
50 | } |
Так в чём проблема? Bus.Date() - возвращает целое число, в Bus::send требует указателя в качесвте параметра. Вот и ругается. Чего Вы хотите-то?
Так в чём проблема? Bus.Date() - возвращает целое число, в Bus::send требует указателя в качесвте параметра. Вот и ругается. Чего Вы хотите-то?
а как правильно написать Bus.Date() что бы она возвращала указатель?
1
uint16_t * BusRS485::Date(
void
) {
2
return
InPack.Data;
3
}
1
uint16_t * BusRS485::Date(
void
) {
2
return
InPack.Data;
3
}
то-же ругается...
может вот так? с явными приведением типа ???
01
class
BusRS485 {
02
private
:
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);
10
public
:
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
24
uint16_t *BusRS485::Date (){
25
return
(uint16_t *)InPack.Data;
26
}
то-же ругается...
Ах, ну, да, там же массив (кстати, впредь Вы говорите как именно ругается).
Тогда вот так:
1
uint16_t * BusRS485::Date(
void
) {
2
return
&(InPack.Data[0]);
3
}
Так лучше, явным преобразованием не злоупотребляйте, часто оно лишь скрывает ошибку, а не устраняет её.
А с какого возвращаем uint16_t *, если буфер описан как uint8_t Data[...]? Не проще вернуть реальный тип (uint8_t *), нежели uint16_t *? Во всяком случае это кошерней будет.
А с какого возвращаем uint16_t *, если буфер описан как uint8_t Data[...]?
Ой, блин, а я и внимания не обратил :)