Найти - Пользователи
Полная версия: отправка at-команд в СОM-порт
Начало » Центр помощи » отправка at-команд в СОM-порт
1 2
Aris_P@
вместо
while ser.inWaiting()>0:
out+=ser.readline()
думаю, стоит написать
out+=ser.read(ser.inWaiting())
по поводу переживаний относительно чтения в цикле - метод
ser.inWaiting()
как раз таки вернет количество принятых байт - потому можете потерять только в случае если переполнился буфер порта. Если обмен данными неинтенсивный, то боятся нечего.
astridsnus
в таком цикле
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("")
и я должен буду опять что-то вводить

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

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()
Aris_P@
а зачем sleep?
может просто стоит реже тики сделать, например каждые 400 мс
def tick_Nms(self):
    self.root.after(400, self.tick_Nms)
astridsnus
да это тоже вариант, даже лучше.
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