Forum: PC Hard- und Software UART Baudrate > 4 MBaud


von Gustl B. (-gb-)


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!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

pySerial dürfte doch im Quelltext verfügbar sein, oder? -> Anpassen.

Allerdings muss auch sichergestellt sein, daß der Devicetreiber, den 
Dein Linux verwendet, um mit dem Prolific-Baustein zu reden, die 
Baudrateneinstellung unterstützt.

von Gustl B. (-gb-)


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?

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


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 ...

: Bearbeitet durch User
von Purzel H. (hacky)


Lesenswert?

Bei erhoehten Baudraten sollte man auch die passenden Line-Treiber 
verwenden, die das koennen. zB einen SN65HVD23D, der 25Mbit auf 160m 
kann.

: Bearbeitet durch User
von Gustl B. (-gb-)


Lesenswert?

Hallo, ja also ich will nur wenige cm. Das Problem ist anscheinend der 
PL2303HX-D der unter Linux nicht mit dem ioctl funktioniert, oder 
zumindest nicht so wie es schön wäre. Hab jetzt den FT2232H bestellt.

von Pandur S. (jetztnicht)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Jetzt Nicht schrieb:
> Windows wure nie als Echtzeit Betriebssystem ausgelegt.

Hier geht es nicht um Windows.

Ansonsten: Allem Geunke zum Trotz lassen sich auch mit Windows 
langzeitstabile Systeme betreiben -- wenn diese nicht Dauerkontakt mit 
dem Internet haben.

von Gustl B. (-gb-)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.