这是从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)
然后读取代码停止从串口读取(代码将运行但没有输入)。我该如何解决这个问题?
答案 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的想法编写了一个实现多线程编程的代码,其中一个函数处理读取而另一个函数处理写入。在它们被调用之前,我将连接到串行端口并将其传递给两个线程。
我不得不使用多线程,因为我需要一个单独的线程来随时从用户输入写入。