Forum: Mikrocontroller und Digitale Elektronik Sequenz an USB senden


von Michael M. (dr_schlau)


Lesenswert?

Hallo zusammen,
ich habe ein USB-Relais an meinem HomeAssistant-PC angeschlossen.
Dieser soll durch die Sequenz b'\xa0\x01\x01\xa2' ein- bzw. 
b'\xa0\x01\x00\xa1' ausgeschaltet werden. (Stand so im Manual)

Der PC erkennt das USB Relais und weist ihm ttyUSB0 zu:
1
[core-ssh ~]$ lsusb |grep 004
2
Bus 002 Device 004: ID 1a86:7523
3
4
[core-ssh ~]$ ls -la /dev/serial/by-id/ |grep 1a86
5
lrwxrwxrwx    1 root     root            13 Sep 12 03:00 usb-1a86_USB_Serial-if00-port0 -> ../../ttyUSB0

Ich habe jede Form versucht, aber das Relais interessiert sich einen 
'Dreck':
1
[core-ssh ~]$ echo "b'\xa0\x01\x01\xa2'" > /dev/ttyUSB0
2
[core-ssh ~]$ echo "160 1 1 162" > /dev/ttyUSB0
3
4
[core-ssh ~]$ echo "160 1 0 161" > /dev/ttyUSB0
5
6
[core-ssh ~]$ echo "10100000000000010000000110100010" > /dev/ttyUSB0
7
[core-ssh ~]$ echo '10100000000000010000000110100010' > /dev/ttyUSB0
8
[core-ssh ~]$ echo '10100000 00000001 00000001 10100010' > /dev/ttyUSB0
9
[core-ssh ~]$ echo '10100000,00000001,00000001,10100010' > /dev/ttyUSB0

Wie kann ich die Sequenz richtig an /dev/ttyUSB0 schicken?

EDIT: Die Homeassistant ist die aktuelle Linux-Distri von 
https://www.home-assistant.io/

Gruß Michael

: Bearbeitet durch User
von Dergute W. (derguteweka)


Lesenswert?

Moin,
Vielleicht so:
1
printf "\xa0\x01\x01\xa2" > /bla/fasel

Gruss
WK

von Monk (roehrmond)


Lesenswert?

Michael M. schrieb:
> echo "b'\xa0\x01\x01\xa2'"

Dieses Kommando tut nicht, was du beabsichtigt hast. Es gibt
1
b'\xa0\x01\x01\xa2'
aus.

Der Vorschlag mit printf sieht gut aus.

von Michael M. (dr_schlau)


Lesenswert?

Hallo WK, Monk,
danke für den Tipp. Das werde ich heute mal probieren. War mir gar nicht 
klar, dass es printf auch in der bash gibt.
Danke und Gruß
Michael

von Norbert (der_norbert)


Lesenswert?

~$ printf  "\xa0\1\1\xa2" | hd
00000000  a0 01 01 a2                                       |....|

~$ printf  "\xa0\1\0\xa1" | hd
00000000  a0 01 00 a1                                       |....|

von Michael M. (dr_schlau)


Lesenswert?

Hallo Norbert, ist das ein hexdump?
Wofür brauche ich den? Formatiert der den String?
Gruß Michael

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Linux macht (auf Kernelebene, also unabhängig davon was du auf der Bash 
sendest) noch eine Verarbeitung mit den an TTY-Geräte gesendeten Daten. 
Mit dem "stty" Befehl kann man das abschalten, da musst du mal googlen 
wie das geht.

IMO kann man "rohe" Daten am Besten mit HTerm an serielle Geräte senden. 
Das funktioniert auch unter Linux. Wenn das funktioniert kann man 
versuchen das auf der Bash oder eigenem Programm zu automatisieren.

: Bearbeitet durch User
von Norbert (der_norbert)


Lesenswert?

Michael M. schrieb:
> Hallo Norbert, ist das ein hexdump?
> Wofür brauche ich den? Formatiert der den String?
> Gruß Michael

Der zeigt dir vorab wie die Daten interpretiert und gesendet werden.
Wenn zufrieden, einfach ›| hd‹ durch die Ausgabeumleitung ersetzen.

von Björn W. (bwieck)


Lesenswert?

Mal so aus Neugier, wo wird in diesen Bespielen eigentlich die Baudrate 
und das Format für die serielle Schnittstelle bestimmt?

von Norbert (der_norbert)


Lesenswert?

Niklas G. schrieb:
> Mit dem "stty" Befehl kann man das abschalten, da musst du mal googlen
> wie das geht.

export DEV=/dev/ttyUSB0

Vor dem Senden: stty -F $DEV raw
Nach dem Senden: stty -F $DEV sane

von Norbert (der_norbert)


Lesenswert?

Björn W. schrieb:
> Mal so aus Neugier, wo wird in diesen Bespielen eigentlich die Baudrate
> und das Format für die serielle Schnittstelle bestimmt?

USB! Wenn die Dinger vernünftig gebaut sind, dann braucht's das nicht.
Ansonsten bei stty mit angeben.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Norbert schrieb:
> Wenn die Dinger vernünftig gebaut sind, dann braucht's das nicht.

Tja, die VID:PID sieht nach einem CH340 aus, d.h. da existiert eine 
physikalische serielle Schnittstelle, da muss man natürlich die Baudrate 
setzen...

von Norbert (der_norbert)


Lesenswert?

Niklas G. schrieb:
> Norbert schrieb:
>> Wenn die Dinger vernünftig gebaut sind, dann braucht's das nicht.
>
> Tja, die VID:PID sieht nach einem CH340 aus, d.h. da existiert eine
> physikalische serielle Schnittstelle, da muss man natürlich die Baudrate
> setzen...

Ähm … Nö. Wie gesagt, hängt vom Programmierer ab.

Da das Device weiss, welche Command Daten herein kommen, kann es ganz 
einfach mal die ersten Bits sniffen und das Timing messen. Danach stellt 
es sich darauf ein.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Norbert schrieb:
> Da das Device weiss, welche Command Daten herein kommen, kann es ganz
> einfach mal die ersten Bits sniffen und das Timing messen

Wie viele Geräte haben wirklich ein Autobaud implementiert? Wer 
überhaupt schon USB auf eine physikalische serielle Schnittstelle 
umsetzen muss statt einfach alles in einem USB-fähigen Mikrocontroller 
abzuhandeln wird sich so eine Mühe wohl eher nicht geben.

von Norbert (der_norbert)


Lesenswert?

Niklas G. schrieb:
> Wer überhaupt schon USB auf eine physikalische serielle Schnittstelle
> umsetzen muss statt einfach alles in einem USB-fähigen Mikrocontroller
> abzuhandeln wird sich so eine Mühe wohl eher nicht geben.

oder es nicht können.
Denn die sich stellende Frage lautet: Gehört das in Setup() oder in 
Loop()?

Tschuldigung… ;-)

von Björn W. (bwieck)


Lesenswert?


von Michael M. (dr_schlau)


Lesenswert?

Björn W. schrieb:
> Der TO wird wohl sowas hier haben:
> 
https://www.amazon.de/DollaTek-LCUS-Relais-intelligente-Schaltersteuerung/dp/B07DJ549LX/ref=cm_cr_srp_d_product_top?ie=UTF8&tag=psblog-21
>
> Der möchte bitte mit 9600bps angesprochen werden.

Genau so etwas hat der TO ;-))
Danke für die Tipps.

von Michael M. (dr_schlau)


Lesenswert?

Leute, ihr seid klasse!!
Der Tipp von 'Dergute W.' funktionierte auf Anhieb.
 --> printf  "\xa0\1\0\xa1" > /dev/ttyUSB0

Vielen Dank für eure Hilfe.
Cheers Michael

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Michael M. schrieb:

> Der Tipp von 'Dergute W.' funktionierte auf Anhieb.
>  --> printf  "\xa0\1\0\xa1" > /dev/ttyUSB0

Tja, es hat schon erhebliche Vorteile, wenn man einfach weiß, was man 
tut...

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.