我正在尝试同时使用Python 2.7和PySerial读出多个串行端口。
功能应为:
- 在主程序中,我获取所有打开的串行端口,打开它们并将串行对象附加到串行对象
- 我想在一个子进程中读取每个串行端口数据以进行并行化
最大的问题是:如何将串口对象传递给子进程?
或:
是否存在另一种(也许更好(解决方案?(也许是这个:如何将双绞串口应用于我的问题?
编辑
我想我并不完全清楚我想要实现什么。
我想同时读出 2 个或更多串行端口。由于超时和读出时间,不可能在一个过程中同时读出它们。
以下方法
ser1 = serial.Serial(port="COM1",baudrate=9600)
ser2 = serial.Serial(port="COM2",baudrate=9600)
ser1.write('command for reading out device 1')
output1 = ser1.readline()
ser2.write('command for reading out device 2')
# now you have to wait at least 100ms for device 2 to respond
output2 = ser2.readline()
不能满足我的需求。
另一个方法是并行化子进程中的串行读数。
main.py
import serial # serial communication
from subprocess import Popen, PIPE
ports = ["COM1", "COM2"]
for port in ports:
ser = serial.Serial()
ser.port=port
ser.baudrate=9600
# set parity and ...
serialobjects.append(ser)
# call subprocess
# pass the serial object to subprocess
# read out serial port
# HOW TO PASS SERIAL OBJECT HERE to stdin
p1 = Popen(['python', './ReadCOM.py'], stdin=PIPE, stdout=PIPE, stderr=PIPE) # read COM1 permanently
p2 = Popen(['python', './ReadCOM.py'], stdin=PIPE, stdout=PIPE, stderr=PIPE) # read COM2 permanently
for i in range(10):
print "received from COM1: %s" % p1.stdout.readline() # print output from ReadCOM.py for COM1
print "received from COM2: %s" % p2.stdout.readline() # print output from ReadCOM.py for COM2
ReadCOM.py(摘自相关帖子并编辑(
import sys
while True: # The program never ends... will be killed when master is over.
# sys.stdin.readline()
ser.write('serial command heren') # send command to serial port
output = ser.readline() # read output
sys.stdout.write(output) # write output to stdout
sys.stdout.flush()
提前感谢!
接收参数的第一个更改ReadCOM.py
import sys
import serial
ser = serial.Serial(port=sys.argv[1],baudrate=int(sys.argv[2]))
while True: # The program never ends... will be killed when master is over.
# sys.stdin.readline()
ser.write('serial command heren') # send command to serial port
output = ser.readline() # read output
sys.stdout.write(output) # write output to stdout
sys.stdout.flush()
并在main.py
中传递后:
from subprocess import Popen, PIPE
# call subprocess
# pass the serial object to subprocess
# read out serial port
# HOW TO PASS SERIAL OBJECT HERE to stdin
p1 = Popen(['python', './ReadCOM.py', "COM1", "9600"], stdin=PIPE, stdout=PIPE, stderr=PIPE) # read COM1 permanently
p2 = Popen(['python', './ReadCOM.py', "COM2", "9600"], stdin=PIPE, stdout=PIPE, stderr=PIPE) # read COM2 permanently
for i in range(10):
print "received from COM1: %s" % p1.stdout.readline() # print output from ReadCOM.py for COM1
print "received from COM2: %s" % p2.stdout.readline() # print output from ReadCOM.py for COM2