Raspberry Pi W/ Archlinux:C程序在写入串行端口时会冻结



我在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);

从公共汽车上读书正常工作。我还尝试了程序"微观",因为通常建议它用于测试串行连接,并产生相同的结果:从arduino发送到pi是可以的,试图在pi side上输入字符 -> freeze。

我在打开/配置时尝试了许多不同的东西,例如替换上面显示的简单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

排除任何愚蠢的盖蒂/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方面!:(

首先,raspi无法从PC USB进行直接工作,因为它们限制了RASPI需求,因此您需要外部电源(我使用了智能手机,现在我使用了一个,现在我'm使用插入的USB集线器)

更改是,将您的Arduino排出过多,而Arduino和Raspi Chip Beave则随机插入。检查程序是否冻结时,使用的串行端口仍在那里(请检查DMESG,也许已插入/Uplugged)

如果您的电源很好,请解释您的冻结含义;RASPI冻结或仅代码。eIter案例这是RASPI一侧的故障,尝试更新OS和固件;该串行不检查某人是否正在恢复,因此即使没有人在阅读。

remeber the Close()将始终调用flush(),因此,仅在真正需要时才使用flush()。(在这种情况下,用于调试目的:))

最新更新