通过串口传输stdout不工作

时间:2014-06-22 07:50:47

标签: python c serial-port subprocess raspberry-pi

我试图通过串口传输一个不断变化的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 lineprint line.rstrip()替换最后4行,但都没有生成任何值。

2 个答案:

答案 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

等等。 (预计会有双行空格。)

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

  1. 它仍然是一个缓冲问题吗?这可以通过发送大量数据来调试。最简单的方法是将sleep(1)替换为usleep(1000)。然后会有很多数据流动,缓冲将填充几秒钟。 (如果你每秒打印6个字符,你可能不会等待10分钟,看它是否有缓冲问题。)

  2. 如果这不是缓冲问题,请让您的C程序向stderr打印一些东西。例如,fprintf(sterr, "Hello?\n")以便可以看出该过程确实在运行。

  3. 当问题被隔离后,更容易找到治疗方法。此外,这听起来与操作系统有关。哪个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?我认为它会阻止输出行缓冲,这样你的程序在读取行时就不会再阻塞了。