Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 14, 2013 10:22:44

Aris_P@
От:
Зарегистрирован: 2010-07-24
Сообщения: 46
Репутация: +  2  -
Профиль   Отправить e-mail  

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

вместо

while ser.inWaiting()>0:
out+=ser.readline()
думаю, стоит написать
out+=ser.read(ser.inWaiting())
по поводу переживаний относительно чтения в цикле - метод
ser.inWaiting()
как раз таки вернет количество принятых байт - потому можете потерять только в случае если переполнился буфер порта. Если обмен данными неинтенсивный, то боятся нечего.



Отредактировано Aris_P@ (Окт. 14, 2013 10:23:08)

Офлайн

#2 Окт. 14, 2013 11:41:42

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

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

в таком цикле

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)           
        out += ser.read(ser.inWaiting())    
        if out != '':           
            print (">>".encode('ascii') + out)
если на компорт хоть раз не придут данные от модема (а они у меня сыпятся не постоянно), все упрется в строчку
inline = input("")
и я должен буду опять что-то вводить

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

Офлайн

#3 Окт. 14, 2013 12:39:26

Aris_P@
От:
Зарегистрирован: 2010-07-24
Сообщения: 46
Репутация: +  2  -
Профиль   Отправить e-mail  

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

тогда стоит взять и запилить простенький gui, хотя б на Tkinter например



Офлайн

#4 Окт. 14, 2013 13:05:28

Aris_P@
От:
Зарегистрирован: 2010-07-24
Сообщения: 46
Репутация: +  2  -
Профиль   Отправить e-mail  

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

#-*- coding: UTF-8 -*-
import Tkinter as tk
from serial import Serial
    
class MyApp():
    def __init__(self, *arg,**kw):
        self.root = tk.Tk()
        self.root.title('test')
        self.fr = tk.Frame(height=500, width=200, borderwidth=5, bd=5)        
        self.but_send_comm = tk.Button(self.fr, text = u'Послать команду', command=self.SendCommand)
        self.ent_command   = tk.Entry(self.fr)
        ###
        self.fr.place(x=0, y=0)
        self.ent_command.place(x=0, y=0)
        self.but_send_comm.place(x=0,y=30)
        ###
        self.ser  = Serial(port= 'COM3',baudrate=2400, bytesize=8, parity='N', stopbits=1, timeout=0, xonxoff=False, rtscts=True, writeTimeout=None, dsrdtr=False, interCharTimeout=None)
        self.ser.close()
        self.ser.open()
    ###
    def SendCommand(self):
        buf = self.ent_command.get()#считываем значение из поля ввода
        #тут наверно стоит как-то обработать прочитанную строку
        self.ser.write(buf)
    ###
    def tick_100ms(self):
        self.root.after(100, self.tick_100ms)
        buf = self.ser.read(self.ser.inWaiting())#считываем данные из буфера порта
    ###
    def mainloop(self):
        self.tick_100ms()
        self.root.mainloop()
###
def main():
    app = MyApp()
    app.mainloop()
### 
if __name__ == '__main__':
    main()



Офлайн

#5 Окт. 14, 2013 17:44:52

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

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

большое спасибо! попробую.
кстати говоря автотест, который я писал для проверки модема работает отлично, потому что там не требуется асинхронного режима.

Офлайн

#6 Окт. 15, 2013 10:32:22

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

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

вот теперь все работает. финальный код:

import tkinter as tk
from serial import Serial
import time
    
class MyApp():
    def __init__(self, *arg,**kw):
        self.root = tk.Tk()
        self.root.title('test')
        self.fr = tk.Frame(height=500, width=200, borderwidth=5, bd=5)        
        self.but_send_comm = tk.Button(self.fr, text = u'Послать команду', command=self.SendCommand)
        self.ent_command   = tk.Entry(self.fr)
        ###
        self.fr.place(x=0, y=0)
        self.ent_command.place(x=0, y=0)
        self.but_send_comm.place(x=0,y=30)
        ###
        self.ser  = Serial(port= 'COM3',baudrate=2400, bytesize=8, parity='N', stopbits=1, timeout=0, xonxoff=False, rtscts=True, writeTimeout=None, dsrdtr=False, interCharTimeout=None)
        self.ser.close()
        self.ser.open()
    ###
    def SendCommand(self):
        buf = self.ent_command.get()#считываем значение из поля ввода
        self.ser.write(buf.encode('ascii')+'\r'.encode('ascii'))
    ###
    def tick_100ms(self):
        time.sleep(0.4)
        self.root.after(100, self.tick_100ms)
        buf1 = self.ser.read(self.ser.inWaiting())#считываем данные из буфера порта        
        print(buf1)
    ###
    def mainloop(self):
        self.tick_100ms()
        self.root.mainloop()
###
def main():
    app = MyApp()
    app.mainloop()
### 
if __name__ == '__main__':
    main()

Офлайн

#7 Окт. 15, 2013 12:00:32

Aris_P@
От:
Зарегистрирован: 2010-07-24
Сообщения: 46
Репутация: +  2  -
Профиль   Отправить e-mail  

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

а зачем sleep?
может просто стоит реже тики сделать, например каждые 400 мс

def tick_Nms(self):
    self.root.after(400, self.tick_Nms)



Офлайн

#8 Окт. 15, 2013 12:25:06

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

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

да это тоже вариант, даже лучше.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version