serial: missing characters

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

Hallo,
ich benutze das modul "serial" und es werden empfangene zeichen nicht angezeigt, die bei gleichen parametern mit "putty" dargestellt werden. ich vermute deshalb mal, die zeichen werden alle gesendet, aber teilweise nicht verarbeitet.
Ein ähnliches Problem habe ich im selben Projekt mit dem empfang von GPIB. Dort kann ich die empfangenen Daten in eine Datei loggen. Im Programm sind aber etwa die ersten hundert Daten "null"

Hat irgendwer eine Idee?

Code: Alles auswählen

import serial

def Gemini001Init(Device, Dict, FilePath):
    flag = True
    
    allTypePrm = {  'port' : 'COM1',
                    'baudrate' : 115200,
                    'parity' : 'N',
                    'stopbits' : 1,
                    'bytesize' : 8,
                    'xonxoff' : True,
                    'Prompt' : 'login:'}
            
    client = serial.Serial(port = allTypePrm['port'], baudrate = allTypePrm['baudrate'], bytesize = allTypePrm['bytesize'], parity = allTypePrm['parity'], stopbits = allTypePrm['stopbits'], timeout = 60)
     
    buffer = ''
    while flag:
        buffer = buffer + client.read(client.inWaiting())
        if '\n' in buffer:
            lines = buffer.split('\n')
            print lines.pop(0)      
            if buffer.strip() == allTypePrm['Prompt']:
                client.write('Mickey')
                flag = False
            buffer = ''
BlackJack

@hypnoticum: Also bei dem gezeigten Quelltext ignorierst Du ganz offensichtlich einen Teil der Daten wenn die ausgelesenen nicht zufällig immer an einem '\n' enden.
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

Ich mache es jetzt so:

Code: Alles auswählen

buffer = ''
i = 0    
    while flag:
        buffer = buffer + client.read(client.inWaiting())
        if buffer.count('\n') > i:
            lines = buffer.split('\n')
            print lines[i]
            i = i + 1   
            if buffer.strip() == allTypePrm['Prompt']:
                client.write('Mickey')
                flag = False
            buffer = ''
BlackJack

@hypnoticum: Das ist algorithmisch gesehen immer noch kompletter Unsinn.
Benutzeravatar
pillmuncher
User
Beiträge: 1532
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@hypnoticum: Ich glaube, du willst eher sowas:

Code: Alles auswählen

import serial

def Gemini001Init(device, adict, file_path):
    all_type_prm = {
        'port' : 'COM1',
        'baudrate' : 115200,
        'parity' : 'N',
        'stopbits' : 1,
        'bytesize' : 8,
        'xonxoff' : True
        'timeout' : 60
    }
    client = serial.Serial(**all_type_prm)
    lines = []
    line = ''
    done = False
    while not done:
        for c in client.read(client.inWaiting()):
            if c == '\n':
                if line == 'login:':
                    client.write('Mickey')
                    done = True
                print line
                lines.append(line)
                line = ''
            else:
                line += c
Obwohl mir das auch nicht besonders gefällt.

Gruß,
Mick.
In specifications, Murphy's Law supersedes Ohm's.
BlackJack

@pillmuncher: Das was Du `c` nennst kann mehr als ein Zeichen sein. Du müsstest ``client.inWaiting()`` durch eine literale 1 ersetzen, damit das so funktioniert.
Benutzeravatar
pillmuncher
User
Beiträge: 1532
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@BlackJack:
BlackJack hat geschrieben:@pillmuncher: Das was Du `c` nennst kann mehr als ein Zeichen sein.
Deswegen ja die for-Schleife. serial.Serial.read() liefert laut Doku einen (Byte-)String über den ich zeichenweise iteriere.
In specifications, Murphy's Law supersedes Ohm's.
BlackJack

@pillmuncher: Argh. Mein Fehler. :oops:
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

@BlackJack:
könntest du "algorithmischen Unsinn" etwas genauer ausdrücken, damit dein Kommentar auch einen Sinn ergibt?
BlackJack

@hypnoticum: Jedesmal wenn die ``if``-Bedingung in der ``while``-Schleife zutrifft wird `i` erhöht. Das bedeutet, dass jedes mal mehr Zeilen empfangen werden müssen, bis die überhaupt betrachtet und ausgewertet werden. Und dann wird eine Zeile von diesen immer grösser werdenen Blöcken mit ``print`` ausgegegen und *alle* werden „en block” auf den Prompt geprüft, was so eigentlich nur zutreffen kann, wenn der Prompt in der ersten Zeile steht (oder ausschliesslich „whitespace”-Zeichen davor stehen) und der ganze Rest des Blocks ausschliesslich aus „whitespace”-Zeichen besteht.
Antworten