Seite 1 von 1

serial: missing characters

Verfasst: Freitag 5. August 2011, 16:51
von hypnoticum
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 = ''

Re: serial: missing characters

Verfasst: Freitag 5. August 2011, 18:16
von 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.

Re: serial: missing characters

Verfasst: Montag 8. August 2011, 15:29
von hypnoticum
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 = ''

Re: serial: missing characters

Verfasst: Montag 8. August 2011, 16:36
von BlackJack
@hypnoticum: Das ist algorithmisch gesehen immer noch kompletter Unsinn.

Re: serial: missing characters

Verfasst: Montag 8. August 2011, 16:41
von pillmuncher
@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.

Re: serial: missing characters

Verfasst: Montag 8. August 2011, 16:51
von 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.

Re: serial: missing characters

Verfasst: Montag 8. August 2011, 17:25
von pillmuncher
@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.

Re: serial: missing characters

Verfasst: Montag 8. August 2011, 17:38
von BlackJack
@pillmuncher: Argh. Mein Fehler. :oops:

Re: serial: missing characters

Verfasst: Mittwoch 10. August 2011, 08:01
von hypnoticum
@BlackJack:
könntest du "algorithmischen Unsinn" etwas genauer ausdrücken, damit dein Kommentar auch einen Sinn ergibt?

Re: serial: missing characters

Verfasst: Freitag 12. August 2011, 17:33
von 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.