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?
:
Bearbeitet durch User
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.