Я не знаю ни одного интерфейса CAN, который подключается к последовательному порту (было бы не сложно создать интерфейс на основе микроконтроллера с CAN и последовательными портами). Однако стандартные последовательные порты будут слишком медленными для поддержки более высоких скоростей, доступных в CAN.
Как правило, при использовании API для интерфейса CAN вы сможете читать сообщения, состоящие из идентификатора, длины и до восьми байтов данных. Вам не нужно заботиться о SOF / EOF. Даже если непосредственно на низком уровне интерфейс сопрягается с контроллером CAN (то есть, если у вас есть интерфейс CAN, для которого вам нужно самостоятельно написать драйвер / API), вам все равно не нужно заботиться об этих деталях. И вы вообще не хотите пытаться получить доступ к шине CAN без использования контроллера CAN ...
Если вы хотите сделать вид, что у вас есть интерфейс CAN, вы можете создать функцию-заглушку, которая возвращает эти три элемента: идентификатор, длину данных и 64-битный буфер данных. Это в основном то, что дадут вам все API-интерфейсы CAN. А при передаче CAN-сообщений вы будете использовать те же параметры (ID, длина данных).
PDO определяются использованием поля CAN ID. Теоретически, количество PDO для устройства на самом деле не так ограничено, но предопределенный набор соединений выделил только небольшое количество (четыре) PDO для каждого узла.
PDO - это стандартные кадры CAN. Как уже упоминалось, CAN ID идентифицирует PDO. В предопределенном наборе соединений (которым следует большинство устройств) CAN ID всех сообщений состоит из функциональной части и части ID модуля (идентификатор модуля может быть жестко закодирован для устройства или настраиваться, например, с помощью DIP-переключателей). Биты 10-7 CAN ID - это код функции, а бит 6-0 - это номер модуля. Например, TxPDO1 от устройства с идентификатором модуля 0x10 будет иметь идентификатор CAN 0x190. Старшие четыре бита 11-битного CAN ID, ((CAN_ID & 0x780) >> 7)
, дают вам код функции (TxPDO1 = 3), а остальные биты, (CAN_ID & 0x7f)
, дают идентификатор модуля (который в этом примере был 0x10). Поэтому, если вы прочитаете сообщение на шине CAN с идентификатором CAN 0x190, вы узнаете, что это был PDO от устройства с идентификатором модуля 0x10.
(Проще говоря, можно сказать, что TxPDO1 имеет CAN ID, установленный в 0x180 + <module ID>
, TxPDO2 имеет CAN ID, установленный в 0x280 + <module ID>
и т. Д.)
Способ интерпретации данных в PDO зависит от вашего устройства.
Я предлагаю вам найти хороший учебник по CANopen. К сожалению, большинство из них заставляют все звучать намного сложнее, чем на самом деле. Так что смотрите вокруг, пока не найдете тот, который кажется понятным.