创建带有依赖项的arduino库时出现问题

问题描述 投票:0回答:1

我有一个

ArduinoCanUtils.h
头文件和
ArduinoCanUtils.cpp
源文件,组织在以下目录树中:

Documents
|---Arduino
|   |---libraries
|       |--- autowp-mcp2515
|       |    |--- other library files
|       |
|       |--- ArduinoCanUtils 
|            |--- ArduinoCanUtils.h
             |--- ArduinoCanUtils.cpp

这些文件构成了我正在尝试创建的 ArduinoCanUtils 库。

ArduinoCanUtils.h
的内容如下:

#ifndef ArduinoCanUtils_h
#define ArduinoCanUtils_h

#include <Arduino.h>
#include <stdint.h>
#include <mcp2515.h>


class ArduinoCanUtils
{
  public:
    ArduinoCanUtils();
    uint32_t createCanMsgCanId(uint8_t priorityLevel, uint8_t activityCode, uint8_t destinationAddress, uint8_t originAddress);
    uint8_t getPriorityLevelFromCanMsgCanId(uint32_t canId);
    uint8_t getActivityCodeFromCanMsgCanId(uint32_t canId);
    uint8_t getDestinationAddressFromCanMsgCanId(uint32_t canId);
    uint8_t getOriginAddressFromCanMsgCanId(uint32_t canId);
    void setAllCanMsgDataToZero(struct can_frame &canMsg);

};

#endif

ArduinoCanUtils.cpp
的内容如下:

#include <Arduino.h>
#include <stdint.h>
#include <mcp2515.h> 
#include "ArduinoCanUtils.h"

ArduinoCanUtils::ArduinoCanUtils(){}

uint32_t ArduinoCanUtils::createCanMsgCanId(uint8_t priorityLevel, uint8_t activityCode, uint8_t destinationAddress, uint8_t originAddress)
{
  uint32_t canId = 0;
  canId = canId | originAddress;
  canId = canId | destinationAddress << 8;
  canId = canId | ((uint32_t) activityCode) << 16;
  for (int i = 0; i <= 2; i++){bitWrite(canId, 26 + i, bitRead(priorityLevel, i));}  
  bitWrite(canId, 31, 1);
  return canId;
}

uint8_t ArduinoCanUtils::getPriorityLevelFromCanMsgCanId(uint32_t canId){
  uint8_t priorityLevel = 0; 
  for (int i = 0; i <= 2; i++){bitWrite(priorityLevel, i, bitRead(canId, 26 + i));}  
  return priorityLevel;
}

uint8_t ArduinoCanUtils::getActivityCodeFromCanMsgCanId(uint32_t canId){
  uint8_t activityCode = 0; 
  for (int i = 0; i <= 7; i++){bitWrite(activityCode, i, bitRead(canId, 16 + i));}  
  return activityCode;
}

uint8_t ArduinoCanUtils::getDestinationAddressFromCanMsgCanId(uint32_t canId){
  uint8_t destinationAddress = 0; 
  for (int i = 0; i <= 7; i++){bitWrite(destinationAddress, i, bitRead(canId, 8 + i));} 
  return destinationAddress;
}

uint8_t ArduinoCanUtils::getOriginAddressFromCanMsgCanId(uint32_t canId){
  uint8_t originAddress = 0; 
  for (int i = 0; i <= 7; i++){bitWrite(originAddress, i, bitRead(canId, i));}  
  return originAddress;
}

void ArduinoCanUtils::setAllCanMsgDataToZero(struct can_frame &canMsg){
    for (int i = 0; i <= 7; i++){canMsg.data[i] = 0;}
}

如您所见,函数

setAllCanMsgDataToZero
需要类型
struct can_frame
作为其参数。这种类型是在第 3 方库autowp-mcp2515(链接:https://github.com/autowp/arduino-mcp2515.git)中定义的,但是当我尝试在以下测试中使用该函数时脚本:

#include <mcp2515.h> 
#include <ArduinoCanUtils.h>

MCP2515 mcp2515Global(10); 
struct can_frame canMsg = {.can_id = 0, .can_dlc = 8, .data = {0,0,0,0,0,0,0,0}}; 
ArduinoCanUtils canUtils;

void setup() {
  // put your setup code here, to run once:

uint32_t a = canUtils.createCanMsgCanId(1, 1, 2, 1);
uint8_t b = canUtils.getActivityCodeFromCanMsgCanId(a);
canUtils.setAllCanMsgDataToZero(&canMsg);

}

void loop() {
  // put your main code here, to run repeatedly:

}

编译后得到以下错误日志(见图):

有趣的是,我的库中的所有其他函数似乎都工作正常,只有该函数存在问题。

我确保包含所有必要的依赖项。此外,除了

setAllCanMsgDataToZero
之外的其他功能似乎都运行良好。我验证了我正确声明了 struct can_fame,但我不知道为什么它不断引发该错误。非常感谢您的帮助。这是我第一次为 Arduino 编写库,我尝试在互联网上搜索,但没有找到什么帮助。我希望你能帮助我。

arduino dependencies libraries can-bus arduino-c++
1个回答
0
投票

我并不像我想象的那样熟悉“通过引用传递”。我应该做

canUtils.setAllCanMsgDataToZero(canMsg)
而不是
canUtils.setAllCanMsgDataToZero(&canMsg)
,因为在第二种情况下,我传递指针,而函数只需要引用。

事实证明这根本不是依赖问题。

© www.soinside.com 2019 - 2024. All rights reserved.