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