Модель Raspberry GSM не работает - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь запустить этот код для отправки SMS-сообщения:

import serial
import time

ser = serial.Serial('/dev/ttyAMA0',baudrate=9600, timeout=3)
ser.write("AT\r")
response = ser.readlines(None)
ser.write("AT+CMGF=1\r")
response = ser.readlines(None)
ser.writ('AT+CMGS="+9693550770"\r')
response = ser.readlines(None)
ser.write("F=Hello Raspberry pi")
ser.weite(ch(26))
time.sleep(19)
ser.close()

ошибка:

%Run sms.py
Traceback (most recent call last):
  File "/home/pi/Desktop/sms.py", line 4, in: ser.write("AT\r")
  File "/usr/lib/python3/dist-packages/serial/serialposix.py", line 518, in write d = to_bytes(data)
  File "/usr/lib/python3/dist-packages/serial/serialutil.py", line 63, in to_bytes 
      raise TypeError('unicode strings are not supported, please encode to bytes: {!r}'.format(seq))
  TypeError: unicode strings are not supported, please encode to bytes: 'AT\r'

Ответы [ 2 ]

0 голосов
/ 24 июля 2018

Метод write() ожидает байты вместо строк. Простейшим решением является префикс строковых литералов с b.

Вы также не должны пытаться прочитать более одной строки в ответ на каждую команду AT. Метод readlines() читает все строки, пока отправитель не закроет свой конец соединения, поэтому ваш код будет просто зависать там.

import time
import serial


def main():
    with serial.Serial('/dev/ttyAMA0', baudrate=9600, timeout=3) as connection:
        connection.write(b'AT\r')
        _response = connection.readline()
        connection.write(b'AT+CMGF=1\r')
        _response = connection.readline()
        connection.write(b'AT+CMGS="+9693550770"\r')
        _response = connection.readline()
        connection.write(b'F=Hello Raspberry pi\x1a')
        time.sleep(19)


if __name__ == '__main__':
    main()

Может быть, вы хотите что-то сделать с ответами. : -)

0 голосов
/ 28 июня 2018

Вы хотите отправить чистые символы в байтах на последовательный интерфейс, и вы хотите использовать кодировку ASCII. Литерал "AT \ r" - это строковый объект Unicode, который не принимается методом записи. Как говорит Пол Джонсон, вы хотите использовать someliteral.encode('ascii', 'ignore'), чтобы оно было принято.

ser = serial.Serial('/dev/ttyAMA0',baudrate=9600, timeout=3)
def send(x):
    global ser
    ser.write(x.encode('ascii', 'ignore'))

send("AT\r")
...
send("AT+CMGF=1\r")
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...