Python中断循环并再次进入循环

时间:2018-07-14 16:28:15

标签: 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,然后进行60秒的响应,然后再次发送sendhttppost。但是代码不会再次进入读取响应。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

因为readResponse()函数只有在遇到serialTimeoutException时才会中断。请注意,您已将break语句放在if块内的except块下。这意味着只要您的程序没有遇到该异常,while循环就会无限进行。如果您希望函数在执行try内的readResponse()块后立即返回,则只需在return之后放置print(ser.readline())语句,然后将time.sleep() readResponse()函数末尾的方法。不要将其嵌套在if块中。

P.S。 time.sleep(1)在这里:

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

是无效代码。我认为您需要重新考虑如何使用if块。

答案 1 :(得分:0)

我自己找到了解决方法

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

def readresponse():

while time.time() < timeout_start + timeout:
    try:
        print(ser.readline())
        time.sleep(1)
    except ser.SerialTimeoutException:
        print('Data could not be read')
    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()
    time.sleep(1)
    readresponse()
    timeout_start = time.time()
    time.sleep(1)