共計(jì) 3060 個(gè)字符,預(yù)計(jì)需要花費(fèi) 8 分鐘才能閱讀完成。
這篇文章主要介紹怎么添加新的 CAN 卡,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
簡(jiǎn)介
控制器區(qū)域網(wǎng)絡(luò)(CAN)是在許多微控制器和設(shè)備中密集使用的網(wǎng)絡(luò),用于在沒(méi)有主計(jì)算機(jī)幫助的情況下在設(shè)備之間傳輸數(shù)據(jù)。
Apollo 中使用的默認(rèn) CAN 卡是 ESD CAN-PCIe 卡。您可以使用以下步驟添加新的 CAN 卡:
添加新的 CAN 卡
添加新的 CAN 卡需要完成以下幾個(gè)步驟:
實(shí)現(xiàn)新 CAN 卡的 CanClient 類(lèi)。
在 CanClientFactory 中注冊(cè)新的 CAN 卡。
更新配置文件。
以下步驟展示了如何添加新的 CAN 卡 – 示例添加 CAN 卡到您的工程。
步驟 1
實(shí)現(xiàn)新 CAN 卡的 CanClient 類(lèi),下面的代碼展示了如何實(shí)現(xiàn) CANClient 類(lèi):
#include string
#include vector
#include hermes_can/include/bcan.h
#include modules/canbus/can_client/can_client.h
#include modules/canbus/common/canbus_consts.h
#include modules/common/proto/error_code.pb.h
* @namespace apollo::canbus::can
* @brief apollo::canbus::can
*/
namespace apollo {
namespace canbus {
namespace can {
* @class ExampleCanClient
* @brief The class which defines a Example CAN client which inherits CanClient.
*/
class ExampleCanClient : public CanClient {
public:
/**
* @brief Initialize the Example CAN client by specified CAN card parameters.
* @param parameter CAN card parameters to initialize the CAN client.
* @return If the initialization is successful.
*/
bool Init(const CANCardParameter parameter) override;
/**
* @brief Destructor
*/
virtual ~ExampleCanClient() = default;
/**
* @brief Start the Example CAN client.
* @return The status of the start action which is defined by
* apollo::common::ErrorCode.
*/
apollo::common::ErrorCode Start() override;
/**
* @brief Stop the Example CAN client.
*/
void Stop() override;
/**
* @brief Send messages
* @param frames The messages to send.
* @param frame_num The amount of messages to send.
* @return The status of the sending action which is defined by
* apollo::common::ErrorCode.
*/
apollo::common::ErrorCode Send(const std::vector CanFrame frames,
int32_t* const frame_num) override;
/**
* @brief Receive messages
* @param frames The messages to receive.
* @param frame_num The amount of messages to receive.
* @return The status of the receiving action which is defined by
* apollo::common::ErrorCode.
*/
apollo::common::ErrorCode Receive(std::vector CanFrame * const frames,
int32_t* const frame_num) override;
/**
* @brief Get the error string.
* @param status The status to get the error string.
*/
std::string GetErrorString(const int32_t status) override;
private:
...
...
} // namespace can
} // namespace canbus
} // namespace apollo
步驟 2
在 CanClientFactory 中注冊(cè)新 CAN 卡,在 CanClientFactory 中添加如下代碼:
void CanClientFactory::RegisterCanClients() {
Register(CANCardParameter::ESD_CAN,
[]() - CanClient* { return new can::EsdCanClient(); });
// register the new CAN card here.
Register(CANCardParameter::EXAMPLE_CAN,
[]() - CanClient* { return new can::ExampleCanClient(); });
}
步驟 3
接下來(lái),需要更新配置文件 在 /modules/canbus/proto/can_card_parameter.proto 添加 EXAMPLE_CAN;
message CANCardParameter {
enum CANCardBrand {
FAKE_CAN = 0;
ESD_CAN = 1;
EXAMPLE_CAN = 2; // add new CAN card here.
}
... ...
}
Update /modules/canbus/conf/canbus_conf.pb.txt
can_card_parameter {
brand:EXAMPLE_CAN
type: PCI_CARD // suppose the new can card is PCI_CARD
channel_id: CHANNEL_ID_ZERO // suppose the new can card has CHANNEL_ID_ZERO
... ...
以上是“怎么添加新的 CAN 卡”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道!