【问题标题】:Raspberry Pi w/ Archlinux: C program freezes when writing to serial port带有 Archlinux 的 Raspberry Pi:写入串行端口时 C 程序冻结
【发布时间】: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


    【解决方案1】:

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

    变化是插入您的 arduino 会消耗过多的电量,并且 arduino 和 rasPi 芯片会随机移动。检查,当程序冻结时,使用的串口是否仍然存在(用dmesg检查,可能它已被插入/卸载)

    如果你的电源没问题,那么解释一下你所说的冻结是什么意思; rasPi 冻结或只有代码。 Eiter case是rasPi端的故障,尝试更新操作系统和固件;串口不会检查是否有人在接收,因此即使没有人在读取,flush 也应该只挂起写入缓冲区所需的时间。

    请记住,close() 将始终调用 flush(),因此只有在真正需要时才使用 flush()。 (就像在这种情况下,出于调试目的:))

    【讨论】:

    • 感谢您的回复。只有 C 程序冻结,Pi 似乎完全没问题。串行端口仍然存在,当冻结发生时,dmesg 什么也不报告(我也做了一个“watch -n 0.1 'ls /dev/ttyACM0'”以防万一;)。我总是更新操作系统(Archlinux)(它也更新固件)。我之前使用的 Raspbian Wheezy 也出现了同样的问题。
    • 锉刀和 arduino 的电源是什么?您是否知道 arduino 在 5v 时“思考”并在 3.3v 时发出粗锉,所以您需要一个逻辑电平转换器,否则您会损坏 te raspi?
    • Arduino 只是通过 USB 连接到 Pi,而不是通过实际的电子引脚和电路 :) Arduino (Leonardo) 通过相同的 USB 供电,而 Pi 由标准 5V/供电1A PSU 通过其 Micro-USB 连接器。 Arduino 控制的电路全部通过光耦合器连接,以保持它们之间的电气隔离,以实现最大安全性。
    • 我尝试使用专用 PSU (9V/2A) 而不是通过 USB 为 Arduino 供电,但无济于事。同样的事情也会发生。
    • 呃,权限可以吗?似乎其他人也有您的问题:raspberrypi.org/phpBB3/viewtopic.php?&t=43482您的 PSU 给了多少安培?如果您使用 picocom 或其他一些预构建程序,还会发生什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    相关资源
    最近更新 更多