Serielle Befehle senden: funktioniert under Windows, jedoch nichtuntre linux

#4110897
Lesenswert?

Hallo zusammen,

ich habe folgendes Problem.
Ich versuche meinen Projektor per RS-232 ein -und auszuschalten (Sony 
VPL-HW 15). Laut dem communication protocol muss ich eine Baud rate von 
38400 einstellen 1 start-bit 8 data-bits parity auf even und einen 
stop-bit setzten. Aus dem Protokoll ergibt sich dieser HEX-Code 
"a91715000000179a" um den Projektor ein bzw. auszuschalten. (das manual 
ist auch noch mal im Anhang).

Unter Windows funktioniert dies alles einwandfrei. Dort benutze ich das 
Programm HTerm.

Jedoch mit Ubuntu sieht das schon ganz anders aus. Dort bekomme ich den 
Projektor auch nach mehreren Stunden rum probieren nicht eingeschaltet. 
Den serial Adapter habe ich versucht über stty einzustellen und dann die 
Hex-befehle mit "echo "\xa9\x17\x15\x00\x00\x00\x17\x9a" > /dev/ttyUSB0" 
zu verschicken. Irgendetwas scheint dabei nicht zu funktionieren, da ich 
die Shelleingabe erst nachdem ich ich den echo Befehl abgebrochen habe 
(^C) wiederbekomme und am Projektor hat sich auch nichts getan. Ich habe 
auch verschiedene linux Programme benutzt wie cutecom oder GtkTerm.

An einem Berechtigungsproblem sollte es meiner Meinung liegen, da ich 
die Rechte von dem device geändert habe bzw. die Befehle als root 
ausgeführt habe.


Kennt sich jemand mit diesem Problem aus ? oder habe ich etwas völlig 
offensichtliches übersehen ?

Ich hoffe jemand kann mir bei dem Problem helfen.

Beste Grüße Adrian
Angehängte Dateien:
Gast #4110918
Lesenswert?

> Igendetwas scheint dabei nicht zu funktionieren, da ich
> die Shelleingabe erst nachdem ich ich den echo Befehl abgebrochen habe
> (^C) wiederbekomme [..]

Hardwareflusskontrolle ausschalten oder den Projekt gefügig machen.
#4110939
Lesenswert?

Danke für die schnellen Antworten, jedoch hat beides nicht geklappt.
Hier hab ich ma die sie stty Einstelligen:

root@ubuntu:/home/parallels/Downloads# stty -F /dev/ttyUSB0 -a
speed 38400 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; 
eol2 = <undef>; swtch = <undef>; start = ^Q;
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; 
min = 60; time = 1;
parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts
ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon 
-ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 
bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop 
-echoprt -echoctl -echoke

kann man vierleicht hier einen Fehler erkennen ?
#4111017
Lesenswert?

-clocal wäre noch was. Ich hatte aber auch schon das Problem, dass das 
open auf das Device hängt, weil die Daten im Puffer von vorher noch mit 
Flusskontrolle darauf warten, raus zu wollen. Dann muss man open mit 
O_NONBLOCK aufrufen, was in der Shell aber AFAIR nicht geht. Also steck 
den USB-Dongle einfach mal kurz ab...
#4111063
Lesenswert?

Adrian Brennig schrieb:
> An einem Berechtigungsproblem sollte es meiner Meinung liegen, da ich
> die Rechte von dem device geändert habe

Die werden typischerweise von udev automatisch eingestellt.

> bzw. die Befehle als root ausgeführt habe.

Der richtige Weg wäre, den Benutzer, der darauf zugreifen soll, in die 
Gruppe dialout aufzunehmen.

Aber wenn es ein Berechtigungsproblem wäre, käme eine Fehlermeldung, daß 
das Device nicht geöffnet werden kann.
#4111862
Lesenswert?

Hat leider alles nicht geholfen. Ich möchte nur die Hex-Werte senden.
Ich glaube ich werde mir erst mal nen ordentlichen FTDI Adapter besorgen 
müssen. Mein adapter benutzt den ch341 chip. Nach einiger Recherche 
stellte sich raus, dass es für diesen chip nicht wirklich einen linux 
Treiber gibt.

Ich hoffe, dass es mit einem FTDI Adapter funktioniert.
Und danke für die schnelle Hilfe.

Gruß Adrian
Moderator Persönliche Seite #4111939
Lesenswert?

Adrian Brennig schrieb:
> Ich möchte nur die Hex-Werte senden.

Je nachdem, was man an der Schnittstelle noch einstellen muss
(eben so Dinge wie flow control), kann man da nicht einfach was mit
einem echo hinsenden.

Entweder ein fertiges Terminalprogramm benutzen (die Hexwerte muss man
dann als Ctrl-Tastenbelegungen tippen), oder ein kleines C-Programm
schreiben, was den gewünschten String sendet, nachdem es zuvor die
Schnittstelle passend konfiguriert hat.
#4111984
Lesenswert?

Das könnte auch gut sein, denn ich meine mit dem Adapter schon meinen 
Verstärker gesteuert zu haben (mit cr-commands). Nur leider habe ich 
nicht so viel Erfahrung mit seriellen Schnittstellen, deshalb fehlen mir 
da die Ideen wie ich so ein Programm angehen sollte. Ware das auch mit 
einem Skript möglich ?
#4112369
Lesenswert?

Ich werd mich mal ein bisschen in python "reinfummelen". Ich habe auch 
al RX und TX zusammengeschlossen und bekam das hier raus (ich habe den 
Receiver einmal auf Hex und einmal auf ASCII gestellt):

CuteCom:

Hex:
00000000: a9 17 15 00 00 00 17 9a

ASCII :
\0xa9\0x17\0x15\0x00\0x00\0x00\0x17\0x9a

echo:

ASCII:
\xa9\x17\x15\x00\x00\x00\x17\x9a


Hex:
00000000: 5c 78 61 39 5c 78 31 37   5c 78 31 35 5c 78 30 30
00000010: 5c 78 30 30 5c 78 30 30   5c 78 31 37 5c 78 39 61
00000020: 0a


Wenn ich den Hex-code mit CuteCom verschicke, bekomme ich genau das 
selbe wieder zurück. Bei echo sieht das schon ganz anders aus. Ich habe 
das selbe auch mal unter windows probiert, da hatte es ja funktioniert, 
und habe dort auch das selbe zurückbekommen, wie bei CuteCom. Nun frage 
ich mich warum es unter Windows funktioniert, jedoch nicht unter linux? 
Ich bekomme ja bei beiden OS-en das selbe zurück.
#4112526
Lesenswert?

Ich hab jetzt mal nen Python-Script geschrieben:
1
import time
2
import serial
3

4
ser = serial.Serial(
5
    port='/dev/ttyUSB0',
6
    baudrate=38400,
7
    parity=serial.PARITY_EVEN,
8
    stopbits=serial.STOPBITS_ONE,
9
    bytesize=serial.EIGHTBITS,
10
    rtscts=False,
11
    dsrdtr=False,
12
    writeTimeout=None,
13
    interCharTimeout=None,
14
    timeout=None,
15
    xonxoff=False
16
)
17

18
ser.close()
19
ser.open()
20
ser.isOpen()
21

22
OFF=bytearray([0xA9,0x17,0x15,0x00,0x00,0x00,0x17,0x9A])
23

24
ser.write(OFF)
25
ser.close()

Hier hab ich wieder das selbe Problem. Auch hier bekomme ich die 
richtigen werte zurück, wenn ich RX und TX Zusammenschließe, jedoch tut 
sich an meinem Projektor immer noch nichts.

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