首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >串口读写代码之间的连接冲突

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

Stack Overflow用户
提问于 2016-03-25 15:27:01
回答 2查看 309关注 0票数 0

这是从z1 mote读取的代码。

代码语言:javascript
运行
复制
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)

这是我用它来写的代码

代码语言:javascript
运行
复制
# 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)

第二个代码的输出应该是如果msg.payload = "hello":

代码语言:javascript
运行
复制
hello 
True 

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-28 12:25:06

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

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

票数 0
EN

Stack Overflow用户

发布于 2016-03-27 19:03:33

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

代码语言:javascript
运行
复制
ser = serial.Serial(z1port, z1baudrate) # I assume z1port='/dev/ttyUSB1'

然后,在子程序中还创建了一个连接:

代码语言:javascript
运行
复制
ser = serial.Serial("/dev/ttyUSB1")

因此,现在有两个连接试图使用同一个端口。这不管用。

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

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36222823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档