如果我问的方式不对,我很抱歉,但这是我在这里的第一个帖子。到现在为止,我经常来这里,但只是看书。我有一个旧设备,当检测到某些活动时,它会通过西门子C35i手机发送短信。西门子C35i是一个老型号,这就是为什么我想稍微欺骗一下设备,通过树莓派连接到它,读取这些短信,并将它们保存在www之类的服务器上。我没有这种编程经验,但我设法将设备连接到树莓派,并读取设备发送的初始命令。设备一开始会发送ATE0,随后会发送At +CGMM,以确定C35i手机已连接。我设法编写了一个响应程序,但设备只读取响应的前两个字符,即C3,其余部分被切断。我怎么做才能使树莓派响应完整的标识符?我可以在哪里修改?下面是我的程序:
import serial
import time
ser = serial.Serial('/dev/ttyUSB0', 19200) # ustawienia portu COM
at_file = open("AT.dat", "a") # otwarcie pliku AT.dat do zapisu
serial_file = open("serial.dat", "a") # otwarcie pliku serial.dat do zapisu
while True:
data = ser.readline() # odczytanie jednej linii danych z portu COM
data_str = data.decode("cp1252").strip() # konwersja danych na string
if "AT+CGMM" in data_str: # jeśli transmisja zawiera kody AT
response = "C35i"
# Wysłanie odpowiedzi
ser.write((response + "rn").encode("cp1252"))
print(response)
at_file.write(data_str + "n") # zapis do pliku AT.dat
else:
serial_file.write(data_str + "n") # zapis do pliku serial.dat
我没有这种编程经验
那么你应该开始阅读的第一份文件是V.250规范,最重要的是第5章(只是为了强调该文件的重要性:即使在爱立信在移动电话中实现AT命令工作了十多年后,我和我的同事仍然定期参考该标准)。
特别是对于模拟调制解调器(在V.250中称为DCE)的场景,您的代码在从旧设备(从现在开始在此回答中称为DTE)接收AT命令行后缺少发送最终结果代码。最终结果代码为OK
,ERROR
和其他几个响应1。这将在第5.7章"DCE响应"中讨论。
事实上,在发送第一个ATE0
命令行后,DTE应该期待并等待对于在继续之前的最终结果代码,因此,由于它没有收到响应,因此将该命令行作为它发送的唯一命令行是完全可以接受的行为。
DTE在未能收到ATE0
的响应后继续发送AT+CGMM
的唯一原因我认为是像"ATE0
和类似的只是初始化命令,如果它们在某种程度上失败了,那么继续下去,希望事情仍然能解决">。
所以你需要稍微调整一下你的代码,这样你就可以:
- 缓冲传入的数据,直到你收到一个完整的和完整的命令行(参见第5.2章DTE命令行),然后,只有在那时才开始解析命令行。
- 考虑一下你是否想支持命令终止——你很可能会因为不支持它而逃避,但让它成为一个有意识的决定。
- 解析命令行并执行存在的每个命令。
- 命令行执行完毕后返回最终结果代码。
1虽然文本结果代码是规范,但请注意,理论上它们也有可能作为ATV0
的数值传递。因此,如果DTE发送该命令,您应该尊重它。