串口读写代码连接冲突
Clash of connection between serial port read and write codes
这是从 z1 节点读取的代码
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)
这是我用来写入微尘的代码
# 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)
第二个代码的输出应该是 if msg.payload = "hello":
hello
True
但随后读取代码停止从串口读取(代码将运行但没有输入)。我该如何解决这个问题?
您只能为一台设备创建一个串行连接。您问题中的代码创建了两个连接,一个在主例程中,一个在子例程中。在主例程中,您创建连接以与设备建立通信:
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')
另一种选择是在需要进行通信时打开和关闭整个代码中的串行连接。这通常效率要低得多,并且只有在与设备之间只有间歇性通信时才有意义。
我利用@mhopeng 的想法编写了一个实现多线程编程的代码,其中一个函数处理读取,另一个函数处理写入。在它们都被调用之前,我将连接到串行端口并将其传递给两个线程。
我不得不使用多线程,因为我需要一个单独的线程来随时从用户输入中写入。
这是从 z1 节点读取的代码
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)
这是我用来写入微尘的代码
# 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)
第二个代码的输出应该是 if msg.payload = "hello":
hello
True
但随后读取代码停止从串口读取(代码将运行但没有输入)。我该如何解决这个问题?
您只能为一台设备创建一个串行连接。您问题中的代码创建了两个连接,一个在主例程中,一个在子例程中。在主例程中,您创建连接以与设备建立通信:
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')
另一种选择是在需要进行通信时打开和关闭整个代码中的串行连接。这通常效率要低得多,并且只有在与设备之间只有间歇性通信时才有意义。
我利用@mhopeng 的想法编写了一个实现多线程编程的代码,其中一个函数处理读取,另一个函数处理写入。在它们都被调用之前,我将连接到串行端口并将其传递给两个线程。
我不得不使用多线程,因为我需要一个单独的线程来随时从用户输入中写入。