Я пытаюсь создать драйвер последовательного RX на основе обратного вызова и получаю ошибку компиляции, несмотря на то, что я использую структуру, которая хорошо известна и проверена в других приложениях. Я уверен, что я делаю что-то глупое, но для жизни я не вижу этого, так что несколько дополнительных пар глаз будет высоко оценено.
Устройство должно функционировать следующим образом:
- На строительство, передать в свойствах связи
- Для синхронной связи не создавайте новый поток, просто заблокируйте на TX.
- Для получения данных создайте новый поток и выполните обратный вызов, переданный пользователем на RX.
Для реализации этого у меня есть базовый класс обратного вызова:
namespace ocular
{
Class DeviceCallback
{
public:
DeviceCallback(){}
~DeviceCallback(){}
virtual void DeviceCallbackFunction(unsigned char Data){}
};
}
И метод Start Asynch RX внутри самого класса устройства как:
void DeviceClass::StartAsynchRX( DeviceCallback* callback )
{
m_externalCallback = callback; // Save a local copy of the callback pointer
m_started = true;
StartAsynchRXThread(); // Spawn the RX Thread
return;
}
Затем я получаю свой собственный обратный вызов как:
Class DemoCallbackClass : public ocular::DeviceCallback
{
public:
void DeviceCallbackFunction(unsigned char myData){
std::cout << myData;
};
}
Насколько я могу судить, до сих пор это учебник правильный. Это прекрасно скомпилируется, и я могу создавать, настраивать и использовать класс моего устройства для синхронной передачи. Ошибка компиляции появляется, когда я пытаюсь фактически передать указатель обратного вызова в main:
void main(void)
{
DeviceClass MyDevice();
MyDevice.Initialise( *settings from file* );
DemoCallbackClass MyDemoCallback();
MyDevice.StartAsynchRX( &MyDemoCallback ); // ERROR ON THIS LINE
}
1> ...... \ Src \ Support \ AR2500 Пуск в эксплуатацию \ Main.cpp (99): ошибка C2664: «ocular :: DeviceClass :: StartAsynchRX»: невозможно преобразовать параметр 1 из «DemoCallbackClass (__cdecl *)» (void) 'to' ocular :: DeviceCallback * '
Я вполне уверен, что сделал здесь что-то глупое, но я не могу найти это для своей жизни. На прошлой неделе я написал класс таймера событий, используя тот же подход, и он работает просто отлично. Если структура / подход выглядит нормально для всех, я полагаю, это неуловимая опечатка, и мне просто нужно переписывать порцию за раз, пока я не избавлюсь от этой чертовой ошибки.
Ваш в отчаянии,
DKW