2013-10-05 14 views
2

我想创建一个线程来侦听来自COM串行端口的传入数据,而主线程正在做一些操作。如何让一个线程侦听数据,而主线程正在做一些操作

这里是我的代码(有些代码为简洁起见省略):

def readMsg(serial): 
    msgArray = [] 
    while (True): 
     char = "0x" + serial.read().encode('hex') 
     if char == '0xfd': 
      msgArray = [] 
      msgArray.append(char) 
     elif char == '0xfc': 
      msgArray.append(char) 
      print debugPrefix, "ComPort:", (serial.port + 1), msgArray 
     elif char == '0x': 
      pass 
     else: 
      msgArray.append(char) 


# Find available ports     
initializeComPorts() 

# Print port infos 
printComPorts() 

# Opens serial and returns opened serial 
serialPort = openPort(1); 

print "thread started" 
readMsgThread = threading.Thread(target=readMsg(serialPort)) 
readMsgThread.setDaemon(True) 
readMsgThread.start() 

print "sending some data" 
serialPort.send('h') 

当我执行的代码readMsgThread听好的,但从未执行的行print "sending some data"。有人能解释我错过了什么吗?我一直坚持这一点。

非常感谢。

+1

小心'while True:'循环。它可能需要100%的CPU核心。用'time.sleep'替换'pass'。 – Igonato

+1

@Igonato,大概是'serial.read()'块,直到端口上的数据可用。在这种情况下,睡觉不合适。但是,是的,否则是的;-) –

回答

7

我不能为你测试,但仔细想想这行:

readMsgThread = threading.Thread(target=readMsg(serialPort)) 

电话readMsg(serialPort)在分配excecuted的时间,并将结果作为target。我猜你几乎肯定想做:

readMsgThread = threading.Thread(target=readMsg, args=(serialPort,)) 

改为。

为了澄清多一点,因为你呼吁readMsg该行上,没有进一步的行会,直到readMsg回报执行。但那个函数永远不会返回。这就是为什么“发送一些数据”从未见过。事实上,你永远不会去

readMsgThread.setDaemon(True) 

声明。

相关问题