我有以下代码
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。但是代码不会再次进入读取响应。
有什么想法吗?
答案 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)