Да, контекст, тут действительно необходим.
Во-первых, присоединяю архив с сайта www.keil.com - чтобы
было понытно о чём идёт речь.
Во-вторых, сразу спрошу конкретно:
1) Читаю нижеприведённый текст с описанием функций и
не могу понять - как осуществляется ответ на такой запрос ?
Заодно хотелось бы знать - приходилось ли Вам применять
когда-нубудь такие запросы или писали что-то своё?
int CAN1ReqRemote (unsigned int ch) {
unsigned char typ;
if (ch >= sizeof (id_typ)) return (-1); // channel not defined
typ = id_typ[ch];
if ((typ & DIR_MASK) != CanRX) return (-1); // channel is not a receiving channel
C1MOBJ[ch].msg_ctl = TXRQ_SET & NEWDAT_CLR; // Очищаем данные и требуем
// передачу "пустого" сообщения,
// которое на самом деле состоит
// из поля идентификатора и
// поля контрольной суммы
return 0;
}
/*
* CanSetRemote:
* Input Parameter: ch := message object channel (1 .. 15)
* p := pointer to data buffer
*
* - check if CAN message object is defined for transmission
* - Fill data buffer with data
*/
int CAN1SetRemote(unsigned int ch, void *p) {
unsigned char typ;
if (ch >= sizeof (id_typ)) return (-1); // channel not defined
typ = id_typ[ch];
if (!(typ & DIR_MASK)) return (-1); // channel is not a transmission channel
C1MOBJ[ch].msg_ctl = NEWDAT_CLR & MSGVAL_CLR; // очищаем часть буфера с данными
// и делаем буфер недействительным
memcpy (C1MOBJ[ch].msg, p, (typ >> 4)); // записываем в буфер сообщения "ответ"
// на запрос данных
C1MOBJ[ch].msg_ctl = NEWDAT_SET & MSGVAL_SET; // показываем, что были записаны
// новые данные и делаем буфер
// действующим, но не требуем
// передачи сообщения!
// TXRQ не устанавливаем!
return 0;
}
2) Чем отличаются очень похожие функции(описываются в файле CAN1.C, который находится в
присоединённом к этому сообщению архиве) CAN1Send, CAN1Read
и CAN1SendIsr, CAN1ReadIsr ?
Уточню вопрос - когда следует применять CAN1Send, CAN1Read,
а когда CAN1SendIsr, CAN1ReadIsr?