我试图通过串口传输一个不断变化的5位数值,假装我有一个名为jsfake
的程序
int main() {
while (1) {
printf("02000\n");
fflush(stdout);
sleep(1);
}
return 0;
}
然后我有我的实际python脚本,旨在通过串口传输来自C程序的stdout。然后我在底部添加了一个部分来接收序列,以及我正在测试它从一个覆盆子pi到同一个,所以我可以确定它在尝试从另一台计算机接收它之前工作。
from serial import Serial
import subprocess
subp = subprocess.Popen("./jsfake",stdout=subprocess.PIPE)
port = Serial("/dev/ttyAMA0",115200,timeout=3)
while True:
for line in iter(subp.stdout.readline, ''):
port.write(line)
if port.inWaiting!=0:
rcv = port.read(6)
print rcv
然而,我的代码在for line in iter(subp.stdout.readline, ''):
行等待,因为当我用ctrl-c中断它时,它始终处于这一点。但它没有打印任何值。
编辑:
我尝试用print line
和print line.rstrip()
替换最后4行,但都没有生成任何值。
答案 0 :(得分:0)
这是其中之一"应该工作"的东西。我尝试了以下两段代码:
#include <stdio.h>
#include <unistd.h>
int main(void)
{
int i = 0;
for (;;)
{
printf("%05d\n", i % 1000000);
i++;
fflush(stdout);
sleep(1);
}
return 0;
}
编译时使用:
gcc -Wall -Wstrict-prototypes -o test test.c
和test.py
:
import subprocess
subp = subprocess.Popen("./test",stdout=subprocess.PIPE)
for line in iter(subp.stdout.readline, ''):
print line
当我在同一目录中运行python test.py
时,我得到了我的预期:
00000
00001
00002
等等。 (预计会有双行空格。)
如果无法复制此成功,则调试需要两个步骤:
它仍然是一个缓冲问题吗?这可以通过发送大量数据来调试。最简单的方法是将sleep(1)
替换为usleep(1000)
。然后会有很多数据流动,缓冲将填充几秒钟。 (如果你每秒打印6个字符,你可能不会等待10分钟,看它是否有缓冲问题。)
如果这不是缓冲问题,请让您的C程序向stderr打印一些东西。例如,fprintf(sterr, "Hello?\n")
以便可以看出该过程确实在运行。
当问题被隔离后,更容易找到治疗方法。此外,这听起来与操作系统有关。哪个OS?
答案 1 :(得分:0)
试试这个:
import subprocess
from serial import Serial
port = Serial("/dev/ttyAMA0",115200,timeout=3)
subp = subprocess.Popen("./test",stdout=subprocess.PIPE)
for line in iter(subp.stdout.readline, ''):
port.write(line,)
print line,
我不确定这是如何工作的,但是按照这里What's ending comma in print function for?我认为它会阻止输出行缓冲,这样你的程序在读取行时就不会再阻塞了。