<p>我建议创建一个新的串行对象,并根据需要多次读取:</p>
<pre><code>import serial, time
try:
station1 = serial.Serial('/dev/ttyUSB0', 9600)
print 'station one Is Ready!! Please Show your Card'
except serial.SerialException:
print 'Station 1 is Down'
while True:
card_dataa = station1.read(12)
print card_dataa
</code></pre>
<p>也可以将超时设置为0:</p>
^{pr2}$
<p>在同一个程序中也可以轻松打开串行连接:</p>
^{3}$
<p>这意味着第二个读卡器将等待第一个读卡器完成打印,这就是为什么fingaz建议使用线程。在</p>
<p>以下是线程化的基本概念证明:</p>
<pre><code>import threading,time,serial
#subclass threading.Thread
class RFIDSerialThread(threading.Thread):
SLEEP_TIME = 0.001 #setup sleep time (update speed)
#constructor with 3 parameters: serial port, baud and a label for this reader so it's easy to spot
def __init__(self,port,baud,name):
threading.Thread.__init__(self) #initialize this instance as a thread
self.isAlive = False #keep track if the thread needs to run(is setup and able to go) or not
self.name = name #potentially handy for debugging
self.data = "" #a placeholder for the data read via serial
self.station = None #the serial object property/variable
try:
self.station = serial.Serial(port,baud,timeout=0) #attempt to initialize serial
self.isAlive = True #and flag the thread as running
except Exception,e:
print name + " is Down",e #in case of errors print the message, including the station/serial port
def run(self): #this gets executed when the thread is started
while self.isAlive:
if self.station != None: self.data = self.station.read(12) #read serial data
time.sleep(RFIDSerialThread.SLEEP_TIME)
if __name__ == '__main__':
#initialize the two readers
station1 = RFIDSerialThread('/dev/ttyUSB0',9600,"station #1")
station2 = RFIDSerialThread('/dev/ttyUSB1',9600,"station #2")
#start the threads
station1.start()
station2.start()
while True:#continously print the data (if any)
if len(station1.data) > 0: print station1.name,station1.data
if len(station2.data) > 0: print station2.name,station2.data
</code></pre>
<p>请注意,我还没有附加实际的硬件来测试,所以这可能不能正常工作,但应该提供足够的信息来进行。在</p>
<p>我也建议尽量与读者保持距离。根据读卡器及其功能,它们可能相互干扰,从而导致错误的数据。如果您仍然对混乱的数据有问题,我会尝试通过排除一些假设来找出问题所在(例如,问题是硬件(读卡器干扰、读卡器损坏、USB接口松动等)还是软件(串行端口未正确初始化/刷新等),一次取出一件东西)</p>