You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派4上MCP3008的C++代码编译报错:函数未声明问题求助

树莓派4上使用C++驱动MCP3008时出现wiringPi SPI函数未定义错误

问题详情

我在树莓派4上尝试用C++驱动MCP3008 ADC芯片,使用了以下代码:

#include <wiringPi.h>
#include <stdio.h>
#include <unistd.h>

int readMCP3008(int &channel);

#define CHANNELS 4
#define SPI_CHANNEL 0
#define REFERENCE_VOLTAGE 5.0

int readMCP3008(int channel) {
    if (channel < 0 || channel >= CHANNELS) {
        fprintf(stderr, "Invalid channel.\n");
        return -1;
    }

    unsigned char buffer[3];
    buffer[0] = 0b11000000 | ((channel & 0x07) << 3);
    buffer[1] = 0;
    buffer[2] = 0;

    wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);

    int result = ((buffer[0] & 0x01) << 9) | (buffer[1] << 1) | ((buffer[2] & 0x80) >> 7);
    return result;
}

int main() {
    if (wiringPiSetup() == -1) {
        fprintf(stderr, "Error initializing WiringPi.\n");
        return 1;
    }

    int spiHandle = wiringPiSPISetup(SPI_CHANNEL, 1000000); // Default SPI speed
    if (spiHandle == -1) {
        fprintf(stderr, "Error initializing SPI.\n");
        return 1;
    }

    FILE *file = fopen("mcp3008_data.txt", "w");
    if (file == NULL) {
        fprintf(stderr, "Error opening file for writing.\n");
        return 1;
    }
   
    const int numSamples = 100; // Adjust as needed
    for (int sample = 0; sample < numSamples; sample++) {
        double value0 = (readMCP3008(0) * REFERENCE_VOLTAGE / 1023.0) - 1.5;
        double value1 = (readMCP3008(1) * REFERENCE_VOLTAGE / 1023.0) - 1.5;
        double value2 = (readMCP3008(2) * REFERENCE_VOLTAGE / 1023.0) - 1.5;
        double value3 = (readMCP3008(3) * REFERENCE_VOLTAGE / 1023.0) - 1.5;

        fprintf(file, "%.2f,%.2f,%.2f,%.2f", value0, value1, value2, value3);

        fprintf(file, "\n");
 
        usleep(100000); // 100,000 microseconds = 100 milliseconds (adjust as needed)
    }
   
    fclose(file);

    return 0;
}

编译时出现以下错误:

g++ -Wall -o "mcp3008_read" "mcp3008_read.cpp" (/home/*/Desktop dizininde)
mcp3008_read.cpp: In function ‘int readMCP3008(int)’:
mcp3008_read.cpp:27:5: error: ‘wiringPiSPIDataRW’ was not declared in this scope
   27 |     wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);
      |     ^~~~~~~~~~~~~~~~~
mcp3008_read.cpp: In function ‘int main()’:
mcp3008_read.cpp:41:21: error: ‘wiringPiSPISetup’ was not declared in this scope; did you mean ‘wiringPiSetup’?
   41 |     int spiHandle = wiringPiSPISetup(SPI_CHANNEL, 1000000); // Default SPI speed
      |                     ^~~~~~~~~~~~~~~~
      |                     wiringPiSetup

我尝试过将函数改为全局函数但无效,已确认wiringSPI库已安装,且MCP3008在Python环境下能正常工作,不知道该如何修复这个错误。

解决方案

1. 编译时链接wiringPi和wiringSPI库

错误的核心原因是编译阶段没有链接对应的SPI库。即使库已安装,g++默认不会自动关联这些库,必须显式指定链接参数。使用以下命令编译:

g++ -Wall -o mcp3008_read mcp3008_read.cpp -lwiringPi -lwiringSPI

2. 补充SPI相关头文件

你的代码仅包含了wiringPi.h,但wiringPiSPIDataRW和wiringPiSPISetup的函数声明位于wiringSPI.h中,需要在代码开头添加:

#include <wiringSPI.h>

3. 修正函数声明与定义的参数不一致问题

代码中readMCP3008的声明是int readMCP3008(int &channel);(引用传递),但定义是int readMCP3008(int channel)(值传递),这会导致编译警告,建议统一为值传递:

int readMCP3008(int channel);

4. 验证运行权限

运行编译后的程序需要root权限才能访问SPI硬件,执行命令:

sudo ./mcp3008_read

内容的提问来源于stack exchange,提问作者Symon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 14:47:32