树莓派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
相关产品推荐
相关产品推荐

