【发布时间】:2014-02-07 04:00:57
【问题描述】:
我的 Raspberry Pi 上连接了一个 Arduino,它在 Archlinux ARM 上运行,我正在使用一个简单的 C 程序读取和写入到 Arduino (/dev/ttyACM0) 的串行总线。
只要我将 Arduino 连接到我的 PC,它就可以正常工作,但是当我使用 Raspberry Pi 时,读取仍然有效,但一旦缓冲区被刷新或连接关闭,写入就会冻结。
这个非常基本的 C 示例实际上会导致这样的冻结: 如果 fflush() 命令在那里,它将冻结在那里,如果它被删除,那么它将在 fclose() 处冻结。
FILE *fp;
fp = fopen("/dev/ttyACM0", "wb");
..error handling..
fprintf(fp, "%c", 'B'); /* write the character 'B' to the serial port)
fflush(fp); /* optional, if more write operations follow, in an actual program */
fclose(fp);
从公共汽车上阅读工作正常。 我还尝试了程序“minicom”,因为它经常被建议用于测试串行连接,它产生了相同的结果:从 Arduino 发送到 Pi 很好,尝试在 Pi 端输入一个字符 -> 冻结。
我在打开/配置方面尝试了很多不同的东西,例如将上面显示的简单 fopen() 序列替换为:
fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY | O_NDELAY);
fcntl(fd, F_SETFL, 0);
if (fd == -1) {
printf("couldn't open serial port.\n");
return -1;
}
fp = fdopen(fd, "w");
并且还更改了一些规范的参数(不确定我实际上在做什么)但无济于事。只要 Pi 尝试将字符写入串行总线,它就会一直冻结。
我还确保所有 TTY 在 Pi via 上都未使用
ps -ef | grep -i tty
排除任何愚蠢的 getty/agetty 干扰。 而且我已经在没有插入任何额外硬件的情况下对其进行了测试,以确保它不是由电源无法维持与 Pi 连接的所有设备引起的症状,正如有人向我建议的那样。
到目前为止,我完全没有想法,只是硬件可能有故障。但这很难相信,不是吗? (而且我没有要测试的替代品。)
更新: 当使用上述替代序列并删除 fcntl() 行时,C 程序不再冻结在编写:
fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
printf("couldn't open serial port.\n");
return -1;
}
fp = fdopen(fd, "w");
所以一开始我很高兴,但实际上写入的数据从未到达 Arduino 端! :(
【问题讨论】:
标签: serial-port arduino raspberry-pi