Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 7, 2013 14:47:29

astridsnus
Зарегистрирован: 2013-10-07
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

отправка at-команд в СОM-порт

Задача такая - есть модем, который работает с at-командами. Он подключается к компьютеру по COM-порту. Модем отвечает и принимает команды в формате ASCII. После включения питания на нем, я должен вывести его в конфигурационный режим. Для этого я даю ему длинную последовательность символов (например “ааааааааааааа”). После этого модем отвечает мне, что вышел в конфигурационный режим. Однако дальше ни одна команда не проходит. Мне приходит только повторенная at-команда.

Сразу скажу, что если использовать Putty, то все работает отлично. То есть проблем в модеме нет.

Читал все темы, но это помогло написать только тот код, который я написал. Код:

import sys
import os
import serial
import time
ser = serial.Serial(port='COM3',baudrate=2400, bytesize=8, parity='N', stopbits=1, timeout=0, xonxoff=False, rtscts=True, writeTimeout=None, dsrdtr=False, interCharTimeout=None)
ser.close()
ser.open()
ser.isOpen()
print(ser.portstr)
print ('Enter your commands below.\r\nInsert "exit" to leave the application.')
inline=1
while 1:
   
    inline = input('>>'.encode('ascii'))
    if inline == 'exit':
        ser.close()
        exit()
    else:
        ser.write(inline.encode('ascii'))
        out = ''.encode('ascii')
       
        time.sleep(0.2)
        while ser.inWaiting() > 0:
            out += ser.readline()
            
            if out != '':
                print (">>".encode('ascii') + out)

Отредактировано astridsnus (Окт. 7, 2013 14:48:51)

Офлайн

#2 Окт. 7, 2013 23:40:54

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

отправка at-команд в СОM-порт

наверное забыли символ конца строки? раз уж известно что модем принимает ASCII, то ему нужно как то отличать одну команду от другой. как то так вроде.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Окт. 8, 2013 10:48:25

astridsnus
Зарегистрирован: 2013-10-07
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

отправка at-команд в СОM-порт

а как бы это написать? я разбираюсь пока что, но может вы знаете сразу?

Офлайн

#4 Окт. 8, 2013 13:58:32

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

отправка at-команд в СОM-порт

ser.write(inline.encode('ascii')+'\r\n')
А вообще у вас должен быть некий мануал, в котором есть описание команж и как их вводить. я ж не знаю что у вас там за железки



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Окт. 8, 2013 14:46:06

astridsnus
Зарегистрирован: 2013-10-07
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

отправка at-команд в СОM-порт

так получится ошибка декодирования байтов в строку.
если написать:

ser.write(inline.encode('ascii')+'\r\n'.encode('ascii'))
то он вероятно просто переводит последовательно символы \ r \ n в ASCII.
команды вида “at*anfgd?” на которые модем выдает мне (если работать через гипертерминал) ответы в виде “c9” или “34000050”.

может все-таки какая-то ошибка в цикле? потому что ответ на первую команду мне приходит, а вот на вторую уже нет (в консоли просто выводится повторенная команда).

Офлайн

#6 Окт. 8, 2013 17:26:05

astridsnus
Зарегистрирован: 2013-10-07
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

отправка at-команд в СОM-порт

под питоном 2.7 все работает без encode

Офлайн

#7 Окт. 11, 2013 16:55:13

astridsnus
Зарегистрирован: 2013-10-07
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

отправка at-команд в СОM-порт

Итак, вот рабочий код, дело действительно было в конце строки:

import sys
import os
import serial
import time
ser = serial.Serial(port='COM8',baudrate=2400, bytesize=8, parity='N', stopbits=1, timeout=0, xonxoff=False, rtscts=True, writeTimeout=None, dsrdtr=False, interCharTimeout=None)
ser.close()
ser.open()
ser.isOpen()
print(ser.portstr)
print ('Enter your commands below.\r\nInsert "exit" to leave the application.')
inline=1
while 1:
    
    inline = input("")
    if inline == 'exit':
        ser.close()
        exit()
    else:
        ser.write(inline.encode('ascii')+'\r'.encode('ascii'))
        out = ''.encode('ascii')
       
        time.sleep(0.4)
        while ser.inWaiting() > 0:
            out += ser.readline()

Офлайн

#8 Окт. 11, 2013 17:01:26

astridsnus
Зарегистрирован: 2013-10-07
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

отправка at-команд в СОM-порт

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

буду очень благодарен, если подскажете как это реализовать.

Офлайн

#9 Окт. 12, 2013 01:17:54

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

отправка at-команд в СОM-порт

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



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#10 Окт. 14, 2013 09:51:52

astridsnus
Зарегистрирован: 2013-10-07
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

отправка at-команд в СОM-порт

идея понятна.

while 1:
читаю
читаю
пишу из буфера
читаю
читаю


когда писать команду в буфер при этом не прерывая цикл? ведь вся пробелема в том, что как только программа предлагает ввести команду чтения не будет, пока я ее не введу.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version