用Python脚本向Node脚本发送串行数据

7

我有两个脚本 - 一个是Python脚本,另一个是Node脚本。Python脚本在一个无限循环中运行并读取串行数据。一旦接收到串行数据,它必须将其传递给Node.js脚本,以便在节点服务器中进行处理。

我考虑使用node.js child_process模块从python脚本中读取数据,但由于python脚本是一个无限循环,它不会向节点脚本返回任何数据。请问有人可以告诉我如何解决这个问题吗?

Python脚本:

import serial
ser = serial.Serial('COM10', 9600, timeout =1)
while 1 :
    print ser.readline()'

Node.js脚本:

var spawn = require('child_process').spawn,
ls    = spawn('python',['pyserial.py']);

ls.stdout.on('data', function (data) {
console.log('stdout: ' + data);
});

ls.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});

注意:我选择使用Python脚本的唯一原因是,由于串口模块存在一些问题,node.js的serialport模块目前无法在我的项目中工作。

串行数据的性质是什么?很多?很少?文本?二进制? - John Zwinck
2个回答

9

在 Python 脚本中打印输出后,需要刷新标准输出流。以下是一个示例,它打印时间(我没有串行设备进行测试):

Python 代码:

import sys
from datetime import datetime
from time import sleep
while 1:
    print datetime.now()
    sys.stdout.flush()
    sleep(5)

Node.js:

var spawn = require('child_process').spawn,
    ls    = spawn('python',['test.py']);

ls.stdout.on('data', function (data) {
    console.log('stdout: ' + data);
});

ls.stderr.on('data', function (data) {
    console.log('stderr: ' + data);
});

@nfreeze 有没有办法在不使用 stdout 的情况下使用这个程序? - Kehlin Swain

6

使用-u Python 命令行开关。这将告诉 Python 使用无缓冲流。

var spawn = require('child_process').spawn,
ls    = spawn('python',['-u', 'pyserial.py']);

ls.stdout.on('data', function (data) {
console.log('stdout: ' + data);
});

ls.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接