python - pySerial + SIM800/900 AT 命令 - 读取缓冲区包含之前的写入缓冲区数据
问题描述
我试图通过 pySerial 向 SIM800 模块发送 AT 命令。我遇到的问题是,当我发送命令时,我收到的消息是上一个命令的输出(或者有时是上一个命令本身)。我的代码如下所示:
import time
import serial
ser = serial.Serial()
ser.port = "/dev/ttyAMA0"
ser.baudrate = 9600
ser.open()
def readData():
buffer = ""
while True:
oneByte = ser.read(1)
if oneByte == b"\n":
return buffer
else:
buffer += oneByte.decode("ascii")
def sendData(command, timeout):
fullcommand = "{}\r\n".format(command)
print "Sent: {}".format(fullcommand)
ser.write(fullcommand)
time.sleep(timeout)
return
sendData("AT", 1) # Expecting "OK" back
print "Return: {}".format(readData()) # Prints AT
sendData("AT+CIPSHUT", 5) # Expecting "SHUT OK" back
print "Return: {}".format(readData()) # Prints OK
sendData("AT+CIPMUX=0", 2) # Expecting "OK" back
print "Return: {}".format(readData()) # Prints AT+CIPSHUT
sendData("AT+CSTT=\"myapn\"", 4) # Expecting "OK" back
print "Return: {}".format(readData()) # Prints SHUT OK
我觉得这与需要刷新缓冲区有关,但我对串行工作没有太多经验。谁能建议我做错了什么?
解决方案
通过 UART 与 SIM 800 通信时,我遇到了同样的问题。我使用 ATE0 命令禁用回声。试试这个它可能对你有帮助。
import serial
import time
# dmesg | grep tty #to get which port it ts using
port = serial.Serial("/dev/ttyO2", baudrate=9600, timeout=1)
if port.isOpen():
print(port.name + ' is open...!!!')
# Transmitting AT Commands to the Modem
port.write('AT'+'\r')
print port.read(32)
time.sleep(2)
# To disable echo
port.write('ATE0'+'\r')
print port.read(32)
time.sleep(2)
推荐阅读
- java - Spring MVC:如何在返回错误页面/响应之前拦截 404?
- html - 将多层下拉菜单从单击变为可悬停
- error-handling - _Unwind_Backtrace 用于 FreeRTOS 上的不同上下文
- sql - 使用序列号更新列
- javascript - 在javascript中对具有相同ID的不同键的值求和
- java - 没有任何 http 请求的 IllegalArgumentException
- python - 如何侦听 (S)FTP 服务器上的更改?
- c# - SetupVerifyInfFile - 参数不正确。如何使用 C# pinvoke
- python - Pandas - 组合偶数/奇数列并按小时聚合
- c - why doesn't writing and reading from pipes take I/O time