Найти - Пользователи
Полная версия: отправка at-команд в СОM-порт
Начало » Центр помощи » отправка at-команд в СОM-порт
1 2
astridsnus
Задача такая - есть модем, который работает с 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)
JOHN_16
наверное забыли символ конца строки? раз уж известно что модем принимает ASCII, то ему нужно как то отличать одну команду от другой. как то так вроде.
astridsnus
а как бы это написать? я разбираюсь пока что, но может вы знаете сразу?
JOHN_16
ser.write(inline.encode('ascii')+'\r\n')
А вообще у вас должен быть некий мануал, в котором есть описание команж и как их вводить. я ж не знаю что у вас там за железки
astridsnus
так получится ошибка декодирования байтов в строку.
если написать:
ser.write(inline.encode('ascii')+'\r\n'.encode('ascii'))
то он вероятно просто переводит последовательно символы \ r \ n в ASCII.
команды вида “at*anfgd?” на которые модем выдает мне (если работать через гипертерминал) ответы в виде “c9” или “34000050”.

может все-таки какая-то ошибка в цикле? потому что ответ на первую команду мне приходит, а вот на вторую уже нет (в консоли просто выводится повторенная команда).
astridsnus
под питоном 2.7 все работает без encode
astridsnus
Итак, вот рабочий код, дело действительно было в конце строки:
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()
astridsnus
теперь возникает вопрос, как сделать этот ком-порт асинхронным. например когда мой модем устанавливает связь, он присылает мне информацию вне зависимости от того, слал я на него команду или нет.
вариант только слушать этот порт мне не подходит, потому что я иногда также должен отправлять ему команды.

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

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


когда писать команду в буфер при этом не прерывая цикл? ведь вся пробелема в том, что как только программа предлагает ввести команду чтения не будет, пока я ее не введу.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB