【发布时间】:2016-04-02 12:41:13
【问题描述】:
我是这里的新手,也是 Python 的新手。我有一个关于字典和多处理的问题。我想在我的 Raspberry Pi 的第二个内核上运行这部分代码(首先是运行 GUI 应用程序)。所以,我创建了一个字典(keys(20) + 数组,每个键的长度为 256 - 下面的脚本只是一个简短的例子)。我在一个单独的脚本中初始化了这个字典,并将这个字典中的所有值都设置为零。脚本 table1.py(这个字典应该在两个内核中都可用)
diction = {}
diction['FrameID']= [0]*10
diction['Flag']= ["Z"]*10
在第二个脚本(应该在第二个内核上运行)中,我读取了从串口获取的值,并根据适当的位置将它们放入/设置到这个字典中(解析+转换)。由于我通过串行端口获取大量信息,因此信息一直在变化。脚本 Readmode.py
from multiprocessing import Process
import time
import serial
import table1
def replace_all(text, dic):
for i, j in dic.iteritems():
text = text.replace(i, j)
return text
def hexTobin(hex_num):
scale = 16 ## equals to hexadecimal
num_of_bits = len(hex_num)*4
bin_num = bin(int(hex_num, scale))[2:].zfill(num_of_bits) #hex to binary
return bin_num
def readSerial():
port = "/dev/ttyAMA0"
baudrate = 115200
ser = serial.Serial(port, baudrate, bytesize=8, parity=serial.PARITY_NONE, stopbits=1, xonxoff=False, rtscts=False)
line = []
for x in xrange(1):
ser.write(":AAFF:AA\r\n:F1\r\n") # new
while True:
for c in ser.read():
line.append(c)
a=''.join(line[-2:])
if a == '\r\n':
b=''.join(line)
print("what I get:" + b)
c=b[b.rfind(":"):len(b)] #string between last ":" start delimiter and stop delimiter
reps = {':':'', '\r\n':''} #throw away start and stop delimiter
txt = replace_all(c, reps)
print("hex num: " + txt)
bina_num=hexTobin(txt) # convert hex to bin
print("bin num: " + bina_num)
ssbit = bina_num[:3] # first three bits
print("select first three bits: " + ssbit)
abit=int(ssbit,2) # binary to integer
if abit == 5:
table1.diction['FrameID'][0]=abit
if abit == 7:
table1.diction['FrameID'][5]=abit
print("int num: ",abit)
print(table1.diction)
line = []
break
ser.close()
p1=Process(target=readSerial)
p1.start()
在此期间,我想阅读这本词典中的信息并将它们用于另一个过程。但是当我尝试读取该值时,所有值都为零。
我的问题是如何创建一个可用于两个进程并可以根据从串行端口获取的数据进行更新的字典? 提前感谢您的回答。
【问题讨论】:
-
由于问题可能出在您的代码中,我们需要看到它才能回答。理想情况下是精简版。
标签: python-2.7 dictionary serial-port multiprocessing