Можно ли отправлять сообщения CAN из функции обратного вызова?

У меня следующая проблема: я хотел бы отправить сообщения CAN из функции обратного вызова. Эта функция обратного вызова вызывается объектом timerobject. Каждый раз, когда выполняется функция обратного вызова, она должна отправить сообщение CAN.

Я закодировал:

canch = canChannel('PEAK-System', 'PCAN_USBBUS1'); 
configBusSpeed(canch, 1000000)  
start(canch) 

canch.Database = canDatabase('\\psf\Home\Desktop\02 CAN DBC\CAN4.dbc'); 

message = canMessage (canch.Database,'IPSS_RX_1_1ms'); 

transmitPeriodic(canch,message, 'On', 0.01); 

T= timer('ExecutionMode','fixedrate','Period',0.2,...
         'TimerFcn',@TEST_timer_callback_fcn,'StopFcn','disp(''Timer has stopped'')');

start(T) 

Функция обратного вызова:

function TEST_timer_callback_fcn(src,event)

message.Signals.In_ti= 39;

Канал CAN запускается, но сообщение не отправляется.

Может кто-нибудь помочь?

1 ответ

Решение

Вполне вероятно, что ваша функция таймера просто не имеет доступа к message объект (т.е. он существует в другой области видимости). Одним из вариантов является вложение вашей функции таймера в функцию, где вы инициализируете message, Кроме того, вы можете пройти message к вашей функции таймера. Вы можете сделать это, изменив строку создания таймера следующим образом:

T = timer('ExecutionMode','fixedrate','Period',0.2,...
          'TimerFcn',@(~,~) TEST_timer_callback_fcn(message),...
          'StopFcn','disp(''Timer has stopped'')');

И функция обратного вызова для этого:

function TEST_timer_callback_fcn(message)

  message.Signals.In_ti= 39;
Другие вопросы по тегам