我用一个简单的方法创建了一个简单的类来向一个号码发送短信:
class SIM800L:
def __init__(self, port):
self.port = port
self.com = serial.Serial(self.port, baudrate = 9600, timeout = 0.5)
def send_serial_command(self, msg):
self.com.write(msg.encode())
print(self.com.readlines())
def send_sms(self, msg, number):
#set to text mode
self.send_serial_command("AT+CMGF=1\r\n")
#set the phone number
self.send_serial_command(f'AT+CMGS="{number}"\r\n')
#sms body
self.send_serial_command(msg)
#sending char 26 is like hitting 'send'
self.send_serial_command(chr(26))
#wait just incase
time.sleep(1)
这适用于方法的单次调用send_sms()
以及当我在循环中将短信发送到相同的号码时。但是,一旦我用列表替换 1 个电话号码并执行以下操作,一切都会出错:
sim800l = SIM800L("/dev/ttyUSB0")
numbers = ["+44XXXXXXXXXX", "+44VVVVVVVVVV"]
for n in numbers:
sim800l.send_sms("Hello" n)
它可以很好地发送到第一个数字,然后当为第二个数字调用该方法时,感觉就像它插入 at 命令作为 msg 的一部分并保存在一些“缓冲区”中(我可能不理解发生了什么正确所以描绘我看到它的方式),然后当循环回到第一个循环时,它再次发送它就好了。我说它将它保存在“缓冲区”中的原因是,如果我将其设置为仅发送到第二个数字,那么到达该数字的下一个 sms 会将这些 AT 命令附加到 msg 的开头。
我怀疑我在 send_sms() 方法的末尾遗漏了一些命令,但在互联网上找不到任何答案。
我尝试过的事情:
- 添加
\r\n
到号码 - 将超时时间增加到 5s
- 关闭和重新打开方法调用之间的串行连接
有任何想法吗?
先感谢您!