UART Baudrate > 4 MBaud

OP #4162739
Lesenswert?

Hallo,

ich möchte von einem PL-2303HXD möglicht einfach unter Linux Daten lesen 
uns zwar mit > 4 MBaud.

Derzeit verwende ich pySerial, aber das geht nur bis 4 MBaud, ich 
brauche aber mehr und auch der Stein kann bis 12 MBaud.

Hat sowas schon Jemand hier gemacht? Wenn ja, wie?

Danke!
OP #4162764
Lesenswert?

Sehr lustig, ja in der Tat hab ich mir den Quelltext schon angeguckt 
aber verstehe da eher wenig.

Hier das verwendet pySerial

https://github.com/bewest/pyserial/blob/master/pyserial/serial/serialposix.py

Aber das zeigt auch eher nur nach Termios. 
http://linux.die.net/man/3/termios

Ich habe hier vor allem deshalb gefragt, weil ich sicher nicht der Erste 
bin, der mehr als 4 MBaud haben will, es gibt da den PL2303HX-D und auch 
den FT2232H die deutlich mehr können, da gibt es doch bestimmt Leute die 
das auch verwenden. Ich sehe nicht den Sinn darin, dass das Jeder selbst 
nochmal baut.

Edit:

Dieser Teil oben z. B.:
1
    def set_special_baudrate(port, baudrate):
2
        import array
3
        buf = array.array('i', [0] * 32)
4

5
        # get serial_struct
6
        FCNTL.ioctl(port.fd, TERMIOS.TIOCGSERIAL, buf)
7

8
        # set custom divisor
9
        buf[6] = buf[7] / baudrate
10

11
        # update flags
12
        buf[4] &= ~ASYNC_SPD_MASK
13
        buf[4] |= ASYNC_SPD_CUST
14

15
        # set serial_struct
16
        try:
17
            res = FCNTL.ioctl(port.fd, TERMIOS.TIOCSSERIAL, buf)
18
        except IOError:
19
            raise ValueError('Failed to set custom baud rate: %r' % baudrate)
20

21
    baudrate_constants = {
22
        0:       0000000,  # hang up
23
        50:      0000001,
24
        75:      0000002,
25
        110:     0000003,
26
        134:     0000004,
27
        150:     0000005,
28
        200:     0000006,
29
        300:     0000007,
30
        600:     0000010,
31
        1200:    0000011,
32
        1800:    0000012,
33
        2400:    0000013,
34
        4800:    0000014,
35
        9600:    0000015,
36
        19200:   0000016,
37
        38400:   0000017,
38
        57600:   0010001,
39
        115200:  0010002,
40
        230400:  0010003,
41
        460800:  0010004,
42
        500000:  0010005,
43
        576000:  0010006,
44
        921600:  0010007,
45
        1000000: 0010010,
46
        1152000: 0010011,
47
        1500000: 0010012,
48
        2000000: 0010013,
49
        2500000: 0010014,
50
        3000000: 0010015,
51
        3500000: 0010016,
52
        4000000: 0010017
53
    }
1
buf = array.array('i', [0] * 32)
 erstellt doch nur ein Array mit einem "i" am Anfang und dann lauter 
Nullen.
1
buf[6] = buf[7] / baudrate
 teilt das eine Null durch die Baudrate?!
1
        2500000: 0010014,
2
        3000000: 0010015,
3
        3500000: 0010016,
4
        4000000: 0010017
 was bedeute da immer die zweite Zahl? In welchem Format gibt die was 
an? Hier unter Linux sieht das sogar noch anders aus:
1
        2500000: 0o010014,
2
        3000000: 0o010015,
3
        3500000: 0o010016,
4
        4000000: 0o010017
 was bedeutet das "o" ist das sowas wie das "x" in hex-Zahlen?
Persönliche Seite #4162816
Lesenswert?

Gustl Buheitel schrieb:
> > buf = array.array('i', [0] * 32)
> erstellt doch nur ein Array mit einem "i" am Anfang und dann
> lauter Nullen.
> > buf[6] = buf[7] / baudrate
> teilt das eine Null durch die Baudrate?!

Dazwischen passiert ja auch noch was:

>         # get serial_struct
>        FCNTL.ioctl(port.fd, TERMIOS.TIOCGSERIAL, buf)

Danach wird "buf" sicherlich anders aussehen als davor.

> was bedeutet das "o" ist das sowas wie das "x" in hex-Zahlen?

Das könnte für Oktal stehen. Betrachtet man die Liste, ist das sogar 
ziemlich sicher, weil der nächstgrößere Wert nach 7 die 10 ist.

Also ist diese Baudratenliste aus irgendeinem schicken Designgrund mit 
oktalen Zahlen codiert.


Vielleicht hilft ja das hier:

http://stackoverflow.com/questions/4968529/how-to-set-baud-rate-to-307200-on-linux

und hier die Antwort, die mit

> Linux uses a dirty method for non-standard baud rates,
> called "baud rate aliasing".

beginnt ...
#4165574
Lesenswert?

Bei solch erhoehten Baudraten sollte man sich erst fragen wozu.

Woher kommt diese Anforderung ?

Wie Portable und zukunftskompatibel soll solche eine Loesung sein?

Muss diese Datenrate am PC dauernd gehalten werden koennen? - Vergessen. 
Windows wure nie als Echtzeit Betriebssystem ausgelegt.

Was koennte man alternativ verwenden ? Ethernet
OP #4165651
Lesenswert?

Ethernet ist deutlich schwieriger zu bauen, also auf der FPGA Seite und 
auch am PC wenn man das empfangen will, da reicht es nicht einfach von 
/dev/ttyUSB0 zu lesen was extrem bequem ist.

Für meine Zwecke reicht die Lösung mit einem USB-UART voll aus, ist 
stabil und schön aus Python heraus bedienbar. Nur schneller wäre schön, 
mal gucken was der FT2232H bietet.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren