Python 通过串行传输标准输出不工作

Python 通过串行传输标准输出不工作,python,c,serial-port,subprocess,raspberry-pi,Python,C,Serial Port,Subprocess,Raspberry Pi,我试图通过串行传输一个不断变化的5位数的值,为了伪装这个,我有一个名为jsfake的程序 然后我有了我实际的python脚本,它被设计用来通过串行通信从C程序传输标准输出。然后,我在底部添加了一个部分来接收串行数据,并且我正在从一个raspberry pi到同一个进行测试,因此在尝试从另一台计算机接收串行数据之前,我可以确定它是否正常工作 from serial import Serial import subprocess subp = subprocess.Popen("./jsfake"

我试图通过串行传输一个不断变化的5位数的值,为了伪装这个,我有一个名为jsfake的程序

然后我有了我实际的python脚本,它被设计用来通过串行通信从C程序传输标准输出。然后,我在底部添加了一个部分来接收串行数据,并且我正在从一个raspberry 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
然而,我的代码在itersubp.stdout.readline中的一行一行地等待:因为当我用ctrl-c中断它时,它总是在这一点上。但是,它不打印任何值

编辑:
我已尝试用print line和print line.rstrip替换最后4行,但两行都没有生成任何值。

这是其中一个应该可行的方法。我尝试了以下两段代码:

#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;
    }
和test.py:

当我在同一目录中运行python test.py时,我得到了我期望的结果:

00000

00001

00002
等等。应使用双线空间

如果无法复制此成功,则调试需要两个步骤:

这可能仍然是一个缓冲问题吗?这可以通过发送大量数据进行调试。最简单的方法是用usleep1000等替代sleep1。然后将有大量数据流动,缓冲区将在几秒钟内填满。如果每秒打印6个字符,您可能不会等待10分钟来查看是否存在缓冲问题

如果这不是缓冲问题,那么让您的C程序也向stderr打印一些东西。例如,fprintfsterr,您好?\n因此可以看出该进程正在真正运行

当问题被隔离后,更容易找到解决方法。而且,这听起来似乎与操作系统有关。哪个操作系统?

试试这个:

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,

我不确定这是如何工作的,但根据这里的情况,我认为它可以防止输出被行缓冲,这样程序在读取行时就不会再阻塞。

如果将所有串行数据都从中删除,您是否可以重新创建问题?您可以将端口写入替换为,例如打印。如果你这么做了,问题还在吗?看看:@DrV请看我的编辑。我从该链接中获取了第二个打印建议,但是这可能不是链接的一部分,尽管我应该查看?我使用的是raspbian,我将尝试您的建议并回复给您,非常感谢!我应该通过你帖子的标签意识到这一点。。。您是在连接到Pi的本地终端显示器+kbd上使用它还是通过SSH使用它?^应该没有什么区别。子进程和串行进程不受ssh.Yep的影响。但无论如何,它都应该起作用,但事实并非如此。SSH向链添加一个链接。另外,这个问题是因为我可以尝试用SSH重现问题,但我手头没有任何kbd或显示。@edward.ij:我用我的Raspberry:works进行了测试,如上所述,没有问题。我通过SSH进入了我的“浆果”,命令、代码和结果与上面完全相同。您是否遇到此最小代码的问题?port.writeline中的逗号应该在右括号之前还是之后?非常感谢much@theoB610:您链接到的问题实际上似乎是,后面的逗号省略了它应该包含的换行符,而stdout通常是行缓冲的,即省略逗号会使事情变得更糟。在这种情况下,它不是,因为有新行来自C程序,这就是为什么我的代码中的输出包含双线空格。在port.write中添加的逗号实际上应该引发一个异常,因为那里的逗号与print语句中的逗号没有相同的魔力。
import subprocess

subp = subprocess.Popen("./test",stdout=subprocess.PIPE)

for line in iter(subp.stdout.readline, ''):
    print line
00000

00001

00002
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,