首页 > 解决方案 > Python中断循环并再次进入循环

问题描述

我有以下代码

import serial
import time
ser = serial.Serial('COM10', 9600, timeout=0)
timeout = time.time() + 60*1

def readresponse():
   while 1:
     try:
        print(ser.readline())
        time.sleep(1)
     except ser.SerialTimeoutException:
        print('Data could not be read')
     if (time.time() > timeout):
        break
     time.sleep(1)

def sendHttpPost():
  ser.write('AT+HTTPACTION=1\r'.encode())
def initialAtCommands():
  ser.write('AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r'.encode())
  ser.write('AT+SAPBR=3,1,\"APN\",\"APN\"\r'.encode())
  ser.write('AT+SAPBR=1,1\r'.encode())
  ser.write('AT+HTTPINIT\r'.encode())
  ser.write('AT+HTTPPARA=\"CID\",1\r'.encode())
  ser.write('AT+HTTPPARA=\"URL\"URL\"\r'.encode())

 if(ser.isOpen() == False):
    print("Serialport is currently not connected")   
 else:
    print("Serialport successfully connected")
    initialAtCommands()

 while 1:
    sendHttpPost()
    readresponse()

这个想法是,sendhttppost 被执行,然后 readresponse 60 秒,然后再次 sendhttppost。但是代码不会再次进入读取响应。

任何想法为什么?

标签: python

解决方案


因为你的readResponse()函数当且仅当它遇到一个serialTimeoutException. 请注意,您已将break语句放在块下,而该if块又位于except块内。这意味着只要您的程序没有遇到该异常,while循环就会无限进行。try如果您希望函数在执行完内部的块后立即返回readResponse(),那么只需在其后添加一条return语句print(ser.readline())并将方法放在函数time.sleep()的末尾即可。readResponse()不要将它嵌套在if块内。

PStime.sleep(1)这里:

if (time.time() > timeout):
        break
        time.sleep(1)

是死代码。我认为你需要重新考虑你想用这个if块做什么。


推荐阅读