Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Serial port Raspberry Pi w/Archlinux:C程序在写入串行端口时冻结_Serial Port_Arduino_Raspberry Pi - Fatal编程技术网

Serial port Raspberry Pi w/Archlinux:C程序在写入串行端口时冻结

Serial port Raspberry Pi w/Archlinux:C程序在写入串行端口时冻结,serial-port,arduino,raspberry-pi,Serial Port,Arduino,Raspberry Pi,我在Archlinux ARM上运行的Raspberry Pi上连接了一个Arduino,我正在使用一个简单的C程序,它可以读取和写入Arduino(/dev/ttyACM0)的串行总线 只要我把Arduino连接到我的电脑上,它就可以正常工作,但是当我使用Raspberry Pi时,读取仍然有效,但一旦刷新缓冲区或关闭连接,写入就会冻结 这个非常基本的C示例通常会导致这样的冻结: 如果fflush()命令在那里,它将在那里冻结,如果它被删除,那么它将在fclose()处冻结 在公共汽车上看书很

我在Archlinux ARM上运行的Raspberry Pi上连接了一个Arduino,我正在使用一个简单的C程序,它可以读取和写入Arduino(/dev/ttyACM0)的串行总线

只要我把Arduino连接到我的电脑上,它就可以正常工作,但是当我使用Raspberry Pi时,读取仍然有效,但一旦刷新缓冲区或关闭连接,写入就会冻结

这个非常基本的C示例通常会导致这样的冻结: 如果fflush()命令在那里,它将在那里冻结,如果它被删除,那么它将在fclose()处冻结

在公共汽车上看书很好。 我还尝试了“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端(

首先,rasPI无法通过PC USB直接工作,因为它们被限制在rasPI需要的范围内,因此您需要一个外部电源(我使用的是智能手机的电源,现在我使用的是插入式USB集线器)

更改是,插入arduino会消耗太多的电量,arduino和rasPi芯片会随机移动。检查程序冻结时使用的串行端口是否仍然存在(使用dmesg检查,可能已插入/上传)

如果您的电源正常,请解释您所说的冻结是什么意思;rasPi冻结还是只冻结代码。如果是rasPi端的故障,请尝试更新操作系统和固件;串行文件不会检查是否有人正在接收,因此flush应该只挂起写入缓冲区所需的时间,即使没有人在读取


请记住close()将始终调用flush(),因此只有在真正需要时才使用flush()。(如本例中调试紫色:)

谢谢您的回复。只有C程序冻结,Pi看起来完全正常。串行端口仍然存在,当冻结发生时,dmesg根本不报告任何内容(为了以防万一,我也做了一个“watch-n0.1'ls/dev/ttyACM0'”)。我总是更新操作系统(Archlinux)(它也更新固件)。同样的问题也发生在拉斯宾哮喘病上,我以前用过。拉斯宾和阿杜伊诺的力量来源是什么?你知道arduino在5v下“思考”,rasp在3,3v下,所以你需要一个逻辑电平转换器,否则你可能会损坏te raspi?arduino只是通过USB连接到Pi,而不是通过实际的电子管脚和电路:)arduino(莱昂纳多)通过相同的USB供电,而Pi则通过标准的5v/1A PSU通过其微型USB接口供电。Arduino控制的电路都通过光耦合器连接,以保持它们的电隔离,以实现最大安全性。我尝试用专用PSU(9V/2A)而不是USB为Arduino供电,但没有成功。同样的事情也会发生。嗯,可以吗?似乎其他人也有你的问题:你的PSU能提供多少安培?如果您使用picocom或其他预构建程序,会出现什么情况?
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");