mraaf Ответов: 2

Как открыть СДС прикладного уровня, используя софтинг canusb


Здравствуйте Эксперты,
Я изо всех сил пытаюсь получить доступ к прикладному уровню SDS с помощью функции Softing CAN Layer2 CANL2_send_data (). Интерфейс CAN был успешно инициализирован и готов к записи и чтению.

int CANL2_send_data(CAN_HANDLE can, unsigned long Ident, int Xtd, int DataLength, byte *pData);


параметр функции:
- может: обрабатывать канал
- Имя: Идентификатор
- Xtd: длина идентификатора (0: 11 бит, 1: 29 бит)
- DataLength: количество передаваемых байтов данных

Заголовок СДС инфо:
Логический Адрес: 64
Тип обслуживания: 100 (запись)
Идентификатор: 0x204
Сервисный Параметр: Атрибут 206
Данные: (формат данных?)
//////////////////////////////////////////////////////////////////////////

Проблемы:
1. СДС кадр данных, показывающих, отсутствует первые 2 байта (72 65) от “перезагрузки\р\н” (72 65 62 6Ф 6Ф 74 0d с 0а). Выходной сигнал записывается в монитор CAN/SDS на другом ПК с CANusb, расположенным на той же шине.
2. DLC сокращается до 6 (SDS max data bytes), но как отправить данные, которые больше 6 байт?
3. Параметры СДС, таких как обслуживание клиентов, ЭОИД параметров сервиса не найти себе места в выше функция отправки данных.
4. FRC вернул 0, данные действительно достигли микроконтроллера (подтверждено светодиодным индикатором CAN RX), но он не реагирует соответствующим образом.


Спасибо заранее
мрааф

Что я уже пробовал:

unsigned char* pData = “reboot\r\n”;
int nLength = strlen((const char*)pData); // get length of the string
static unsigned int nID = 0x204;
int frc; // function return code

frc = CANL2_send_data(
m_hCAN[1],        // can1 handle
nID,              // Identifier
0,                // 11 bits (standard identifier)
nLength,          // data length
pData);           // pointer to the address field of the data


Цитата:
Вывод данных SDS:
Передатчик/приемник: приемник | направление: [В] | адресу: 64 | дисков: запись | КДР: 6 | Сведения: 62 6Ф 6Ф Д 74 а | ФРК: 0

///////////////////////////////////////////////////////////////////////

Коды возврата функций:
0 функция выполнена успешно
-1 функция не удалась
-11 неизвестная ошибка
-104 тайм-аут прошивки связи
-1000 недопустимый дескриптор канала

2 Ответов

Рейтинг:
2

mraaf

Это сработало:

unsigned char pData[5];
Ident = 0x204 // SDS logical address 64, service type 4	
pData[0] = 0; // EOID 0
pData[1] = 0xCE; // Attribute 206 for tx
pData[2] = *pXMT; // ASCII char
nLength = 3;
 
frc = CANL2_send_data(m_hCAN[1], Ident, 0, nLength, (unsigned char*)pData);


Затем вызовите его 8 раз (один раз на символ) для команды " reboot\r\n"


Рейтинг:
14

Jochen Arndt

Я не знаю используемой библиотеки CAN и до сих пор не использовал CAN.

Но, похоже, вы перепутали свои nCount и nLength ценности. То DataLength параметр функции CANL2_send_data() функция, вероятно, должна быть длиной строки данных.

Поэтому я бы обменялся инициализацией переменных длины:

// Wrong:
//int nCount = strlen((const char*)pData); // get length of the string
//static int nLength = (int) 8 - nID;
// Should be:
int nLength = strlen((const char*)pData); // get length of the string
static int nCount = (int) 8 - nID;

Также, по-видимому, нет никаких причин для отправки одной и той же командной строки несколько раз (особенно если перезагрузить делает то, что предполагает название).


mraaf

Я исправил перепутанное и снял петлю. Однако монитор кадра данных SDS показывает отсутствующие первые 2 байта, в то время как монитор кадра данных CAN показывает, что все байты были прочитаны.

Jochen Arndt

Мне очень жаль, но, как уже отмечалось, я до сих пор не использовал CAN или SDS.

Я могу только догадываться, что вы должны создавать пакеты данных в соответствии со спецификацией протокола SDS и отправлять их через CAN.

То есть:
Отправьте заголовок SDS, за которым следуют данные полезной нагрузки. На самом деле вы просто отправляете строку, и я предполагаю, что монитор SDS обрабатывает первые два символа этой строки как заголовок и поэтому не отображает их как данные.

mraaf

Спасибо, Йохен, теперь это имеет смысл: недостающие данные должны быть моими отсутствующими полями для встроенного идентификатора объекта и параметров службы.