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

树莓派WiringPi C代码无法发送串口数据,与Python代码是否等价?

Python串口代码与WiringPi C代码的等价性判断

首先,你的Python代码核心配置与行为明确:

  • 串口设备:/dev/ttyAMA0
  • 波特率:9600
  • 校验位:无(NONE)
  • 停止位:2位
  • 循环发送字节数组:0x00, 0xFF, 0x53, 0xC3

两段代码是否等价,完全取决于你的WiringPi C代码是否严格匹配上述所有配置与行为。如果你的C代码存在以下常见问题,就会和Python代码不等价,导致无法输出数据:

常见不匹配点与修复方式

1. 停止位配置未设置为2位

WiringPi的serialOpen函数默认使用1位停止位,而你的Python代码用的是2位,这是最可能的原因。你需要手动通过tcsetattr修改串口属性:

#include <wiringSerial.h>
#include <termios.h>
#include <unistd.h>

int main() {
    int fd = serialOpen("/dev/ttyAMA0", 9600);
    if (fd == -1) return 1;

    // 获取当前串口属性
    struct termios options;
    tcgetattr(fd, &options);

    // 设置2位停止位
    options.c_cflag |= CSTOPB;
    // 无校验位
    options.c_cflag &= ~PARENB;
    // 应用配置
    tcsetattr(fd, TCSANOW, &options);

    // 循环发送指定字节数组
    unsigned char data[] = {0x00, 0xFF, 0x53, 0xC3};
    while(1) {
        for(int i=0; i<4; i++){
            serialPutchar(fd, data[i]);
        }
        delay(1000); // 可选:添加延迟避免发送过快
    }

    serialClose(fd);
    return 0;
}

2. 发送数据方式错误

如果你的C代码用serialPuts发送数据,这会把字节当作ASCII字符串处理(比如0x00会被视为字符串结束符),导致数据发送不完整。必须用serialPutchar逐个发送字节,或者直接用write函数:

write(fd, data, sizeof(data));

3. 权限问题

确保运行C代码的用户属于dialout组(和运行Python代码的用户一致),否则会没有串口访问权限。可以用以下命令添加用户到组:

sudo usermod -a -G dialout $USER

之后重新登录生效,或者直接用sudo运行C程序临时获取权限。

4. 串口设备路径不一致

虽然Python代码能用/dev/ttyAMA0,但要确认C代码里没有写错路径(比如写成/dev/ttyS0)。

总结

只有当你的WiringPi C代码在串口参数配置、设备路径、数据发送方式上完全和Python代码一致时,两段代码才是等价的。如果C代码无法输出数据,优先检查停止位配置是否正确,这是最容易忽略的差异点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:55:19