Raspberry Pi w / Archlinux:写入串口时C程序冻结

时间:2014-01-27 22:43:26

标签: serial-port arduino raspberry-pi

我有一个Arduino连接到我的Raspberry Pi,它运行在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试图将字符写入串行总线,它就会一直冻结。

我还确保通过

在Pi上使用所有TTY
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方面! :(

1 个答案:

答案 0 :(得分:0)

首先,rasPI不能直接从PC USB工作,因为它们的限制低于rasPI需求,所以你需要一个外部电源(我使用的是智能手机,现在我正在使用一个插入的USB集线器)< / p>

更改是插入你的arduino耗尽太大的功率,arduino和rasPi芯片随机发生。检查程序是否冻结时,所使用的串口是否仍然存在(使用dmesg检查,可能已插入/拔出)

如果您的电源正常,请解释冻结的含义; rasPi冻结或只有代码。 Eiter case是rasPi端的故障,尝试更新操作系统和固件;串口不会检查是否有人正在复活,所以即使没有人正在读取,刷新应该只挂起写缓冲区所需的时间。

记住close(),总是调用flush(),所以只有在真正需要时才使用flush()。 (就像在这种情况下,用于调试purpoise :))