AT-команды pySerial + SIM800 / 900 - буфер чтения содержит данные буфера записи ранее - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь отправить AT-команды через pySerial на модуль SIM800. У меня проблема в том, что когда я отправляю команду, сообщение, которое я получаю обратно, является выводом предыдущей команды (или иногда самой предыдущей команды). Мой код выглядит так:

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

Я чувствую, что это связано с необходимостью очистки буферов, но я не слишком опытен в работе с последовательным интерфейсом. Кто-нибудь может подсказать, что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Я столкнулся с той же проблемой при общении с SIM 800 через UART.Я использовал команду 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)
0 голосов
/ 25 апреля 2018

Несколько вещей.

  1. Если вы хотите установить тайм-аут для записи, это нужно сделать с помощью write_timeout либо при инициализации объекта Serial, либо с помощьюнастройка ser.write_timeout

  2. Если вы действительно обеспокоены тем, что данные все еще находятся во входном буфере, вы можете сделать ser.reset_input_buffer()

  3. Если выдействительно обеспокоены тем, что данные все еще находятся в буфере вывода, который вы можете сделать ser.reset_output_buffer()

Теперь с точки зрения кода вы можете сделать что-то вроде этого

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)
    ser.write_timeout = timeout # This is where you can set the timeout
    bytes_written = ser.write(fullcommand)
    # Check to see if all the data was written
    if bytes_written == len(fullcommand):
        print "Sent: {}".format(fullcommand)
    else:
        print 'Not all data transferred'

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
...