【问题标题】:Arduino function changes argument for no reasonArduino函数无缘无故更改参数
【发布时间】:2017-06-24 14:08:39
【问题描述】:

我为 Aduino 编写了一个类,用于读取 ads124x,但我遇到了一个主要问题,我无法调用该类定义的函数。以下是它的结构:

  • .ino 使用 .ino 调用函数。运营商
  • .h 包含寄存器映射和类定义
  • .cpp 包含类的所有函数

到目前为止,.ino 正在成功调用 .cpp 中的函数,但是当同一个函数在 .cpp 中调用另一个函数时,它无法调用。

.ino:

#include "ADS124X.h"
void setup(){
    ADS124X ADS124X(1,2,3,4);
    Serial.begin(9600);
    ADS124X.setUP(0x20, 0x20);}

.h:

class ADS124X{
    public:
        void reset(void);
        void setUP(unsigned char* mux1, unsigned char* sys0);
    private:
        void SPI_Write(unsigned char* data, unsigned char size);
}

.cpp:

void ADS124X::setUP(unsigned char * mux1, unsigned char * sys0)
{

    Serial.println("hi");    //prints this
    delay(1);
    reset();                 // stops here
    Serial.println("hi");    // doesn't print this
    delay(1);
    stopDataCont();
    delay(210);
    setREG(MUX1, mux1, 1);
    setREG(SYS0, 0x01, 1);
    delay(1);
}
void ADS124X::reset(void)
{
    unsigned char dataToSend[] = { RESET };
    START_HIGH;
    CS_LOW;
    Serial.println(RESET);       // prints this as 0x06 (correct value)
    SPI_Write(dataToSend, 1);    // Seems to stop here
    START_LOW;
    CS_HIGH;
}
void ADS124X::SPI_Write(unsigned char * data, unsigned char size)
{
    Serial.println("SPI_Write");    //prints this
    for (unsigned int i = 0; i < size; i++) {
        Serial.println("SPI_Write");    //prints this
        Serial.println(* data);    //prints this as 126 (if RESET is 3 * data becomes 189...)
        SPI.transfer(*data);
        Serial.println("SPI_Write");
        data++;
    }
}

【问题讨论】:

  • 你能解释一下吗
  • 为什么要将两个整数传递给setUP 函数,该函数将两个指向char 的指针作为参数?
  • ADS124X 构造函数在哪里声明和定义?
  • 最后,您遇到了什么问题?你有构建错误吗?出乎意料的结果?崩溃?请花一些时间到read about how to ask good questions
  • 我省略了构造函数,只发布给我带来问题的内容。我没有收到任何构建错误。我传递了 2 个整数,这些整数由我希望广告的功能和数据表定义。这两个整数是寄存器映射中设置的值。 arduino 似乎停在 spi.tranfer(* data);所以我认为问题出在 *data

标签: c++ class types arduino spi


【解决方案1】:

这是不对的……

   Serial.println(RESET);       // println expects a null terminated string  
                                // you are sending a char.

您应该将 dataToSend 定义为一个以 null 结尾的字符数组。

void ADS124X::reset(void)
{
  char dataToSend[] = { RESET, 0 };
  // ...
  serial.println(dataToSend);  // maybe println "reset" would be better?
  SPI_Write(dataToSend, 1); 
  //...
}

不要期望在串行监视器上看到漂亮的0x06,因为那不是可打印的字符。

【讨论】:

  • 感谢我将测试更改 dataToSend。通过 println(RESET),我注意到的问题不是重置,而是 SPI_Write。重置中的打印产生我想要的值(6),当 6 被传递到 SPI_Write 时,它​​变为 126,这是一个问题
  • RESET 是如何声明的?如果它是 #define,则它没有类型,并且可以解释为 int16_t 或纯字节 (int8_t),具体取决于上下文。
  • 它被定义为 (3
  • 你试过const unsigned char RESET=(3 &lt;&lt; 1);而不是#define吗?
猜你喜欢
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多