串口读写代码之间的连接冲突

时间:2016-03-25 15:27:01

标签: python pyserial

这是从z1 mote中读取的代码

def find_count(srch_wrd, srch_char, startlookingat):
counter = 0
index = startlookingat
while index < len(srch_wrd):     
    if srch_wrd[index] == srch_char:
        counter += 1
    index += 1 
return counter`

这是我用它写入微尘的代码

while True:
   if not ser.isOpen():
      try:
        ser = serial.Serial(z1port, z1baudrate,timeout=0, parity=serial.PARITY_NONE, 

                    stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS)
      except:
        sys.exit("Error connecting device")

   queue = ser.inWaiting()
   if queue > 0:
      data = ser.read(1000)
      print data 
   time.sleep(0.2)

第二个代码的输出应该是if msg.payload =&#34; hello&#34;:

# some event-driven code here so that whenever a message is received then do: 
print(str(msg.payload))
ser = serial.Serial("/dev/ttyUSB1")
print ser.isOpen()
ser.write(msg.payload)

然后读取代码停止从串口读取(代码将运行但没有输入)。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您只能为设备创建一个串行连接。您的问题中的代码创建了两个连接,一个在主例程中,另一个在子例程中。在主例程中,您将创建一个连接以与设备建立通信:

ser = serial.Serial(z1port, z1baudrate) # I assume z1port='/dev/ttyUSB1'

然后在你的子程序中你也创建了一个连接:

ser = serial.Serial("/dev/ttyUSB1")

所以现在有两个连接试图使用相同的端口。这不起作用。

相反,您应该在整个程序中使用原始连接, 并定义子例程以接收连接作为输入参数。例如:

ser = serial.Serial(z1port, z1baudrate)
# do whatever to make connection to the device
getMessage(ser) # call subroutine to read data *with the existing connection*
ser.close()     # close connection when finished

def getMessage(serConn):
  # read data
  data = serConn.read(1000)
  # send ack
  serConn.write(b'OK')

另一种选择是在需要进行通信时打开和关闭整个代码中的串行连接。这通常效率低得多,只有在与设备进行间歇性通信时才有意义。

答案 1 :(得分:0)

我使用@mhopeng的想法编写了一个实现多线程编程的代码,其中一个函数处理读取而另一个函数处理写入。在它们被调用之前,我将连接到串行端口并将其传递给两个线程。

我不得不使用多线程,因为我需要一个单独的线程来随时从用户输入写入。