2015-04-22 107 views
3

我用Python写一个程序,它的工作原理是这样的:Python的错误If-Then语句

  1. 以输入字符串通过串行端口,时按Enter(回车)
  2. 检查$签署输入字符串的第一个字符然后继续(如果存在)
  3. 删除除numerics,之外的所有不需要的字符和字母,然后将其打印出来。

问题

程序卡住了,如果要是它获取输入字符串$$标志是不存在输入字符串,因为下一次,它不打印值

亲切审查我代码如下,并指导我如何解决它?

CODE

import serial,re 

x = [0,0,0] 
ser = serial.Serial('/dev/ttyAMA0', 9600) 
buffer = '' 

while True: 
    buffer += ser.read(ser.inWaiting()) 
    if '\n' in buffer: 
     if buffer[0] == '$': 
      x= re.sub("[^0-9\,]","", buffer) 
      x1 = x.rstrip() 
      x2= x1.split(",") 
      print((x2[0]),(x2[1]),(x2[2]))    
      buffer = "" 
+3

每次通过循环时,您都将添加到缓冲区的末尾。这不会改变缓冲区的开始。所以如果第一次没有以'$'开始,它永远不会。 – Barmar

+0

从描述中不清楚你应该做什么,如果它不以'$'开头。也许你应该跳出循环? – Barmar

回答

2

虽然它不是完全明显你的代码的最后目的是什么,你可能只需要取消缩进的最后一行,每次清除缓冲区,否则你会不断地添加到它,如果它不以$开头,它永远不会。

while True: 
    buffer += ser.read(ser.inWaiting()) 
    if '\n' in buffer: 
     if buffer[0] == '$': 
      x= re.sub("[^0-9\,]","", buffer) 
      x1 = x.rstrip() 
      x2= x1.split(",") 
      print((x2[0]),(x2[1]),(x2[2]))    
     buffer = "" 
2

问题是,你不断添加新的行到缓冲区的末尾,只有清除它,如果你碰巧有一个命令。所以,一旦你得到一条不是命令的行,你的缓冲区永远不会以命令开始。

我认为enigma's answer是你所要求的。


,但它仍然不会工作的权利,如果你能永远得到在同一缓冲区两行(或一条线和下部分的恶化,一部分)。所以,你真的想要更多的东西是这样的:

while True: 
    buffer += ser.read(ser.inWaiting()) 
    lines = buffer.split('\n') 
    for line in lines[:-1]: 
     if line[0] == '$': 
      x= re.sub("[^0-9\,]","", line) 
      x1 = x.rstrip() 
      x2= x1.split(",") 
      print((x2[0]),(x2[1]),(x2[2]))    
    buffer = lines[-1] 

split将打破缓冲区中的所有完整的生产线,再加上一个空字符串或吃剩的部分线路。因此,您将处理完整的行,并将剩余的空字符串或部分行粘贴到要添加到下一次读取的缓冲区中。

+0

啊,是的,比我的快速修复更健壮,很好 – enigma