Hallo zusammen! Ich Programmiere schon eine ganze weile in VB2010 aber jetzt möchte ich zum ersten mal Hardwareprogrammierung versuchen. Habe mir dazu ein 4-Kanal USB Relaisboard gekauft (FTDI) es gibt dazu auch beispiele aber alle in VB6 oder früher Kennt vielleicht von euch jemand Tutorials die VB2010 und USB Programmierung betreffen? Mfg
Du brauchst keine USB-Programmierung, denn die FTDI-Bausteine können über den dazugehörigen Devicetreiber exakt so wie /serielle Schnittstellen/ angesprochen werden. Reicht das nicht, gibt es auch noch von FTDI eine DLL-Programmierschnittstelle, die Dir weitere Möglichkeiten gibt. Aber mit USB-Programmierung hast Du in beiden Fällen nichts zu tun.
Erstmals vielen dank für die schnelle Antwort! Und gibt es eine Anleitung wie ich die Schnittstelle anspreche? Also Beispielcodes oder dergleichen? mfg
Mit dem Stichworten "VB.net serial port programming" sollte sich was finden lassen. Dein Relaisboard wird ja auch nicht komplett ohne Dokumentation gekommen sein, oder?
Doch ist komplett ohne Anleitung gekommen. Port öffnen ist mittlerweile kein Problem mehr, aber das schreiben macht noch probleme also das ansteuern der Relais. Weil ich das ganze Prinzip davon noch nicht wirklich verstehe
Da das Gerät wie schon geschrieben wurde als virtueller COM-Port zu Verfügung steht, kannst Du grundsätzlich mal mit einem Programm wie Putty versuchen die Relais anzusteuern, dann weisst Du auch welche Befehle Du senden musst. Da Du nicht gesagt hast, welche Karte genau und wo es Beispiele inn VB6 dazu gibt ist das alles Stochern im Nebel
Würde mich wundern, wenn Du mit Vor- und Nachname der Hardware, bzw. des Herstellers, im Internet, nicht Treiber- und Schnittstellenbeschreibung finden würdest. Sollten die Hersteller, was ich nicht glaube, totale Geheimniskrämer sein, so sollte der Name des verwendeten Chips ausreichen. Normalerweise sprichst Du den Chip von FTDI an und kein Relais. Wahrscheinlich sind andere Hersteller nicht so verschlossen. Die haben vielleicht eine andere Anzahl an Relais auf ihrer Hardware. Das Prinzip sollte aber immer gleich sein, da es auf einem Treiber des Herstellers basiert. Übrigens: In vielen Fällen sind die Treiber bereits installiert, da in diesem Bereich FTDI groß geschrieben wird.
Also ich bin jetzt Prinzipiell schon einen Schritt weiter, der Hersteller hat mir die Commands gesendet, jedoch funktionieren diese nicht, oder was wahrscheinlicher ist, ich mache etwas falsch. Die Commands: K1 ON: (DEC: 255,1,1) <- Funktioniert OFF: (DEC: 255,1,0) <- Funktioniert Nicht K2 ON: (DEC: 255,2,1) <- Funktioniert Nicht OFF: (DEC: 255,2,0) <- Funktioniert Nicht K3 ON: (DEC: 255,3,1) <- Funktioniert Nicht OFF: (DEC: 255,3,0) <- Funktioniert Nicht K4 ON: (DEC: 255,4,1) <- Funktioniert Nicht OFF: (DEC: 255,4,0) <- Funktioniert Nicht Angesprochen wird das ganze über den SerialPort: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim bytearray() As Byte = {255, 1, 1} SerialPort1.Write(bytearray, 0, bytearray.Length) End Sub Mache ich etwas bei meinem Code falsch oder stimmen die Commands nicht? Hersteller FTDIChip (SainSmart) FT245RL SerialPort Einstellungen: BaudRate: 9600 DataBits: 8 DiscardNulle: False DTREnable: False Handshake: None Parity: None ParityReplace: 63 PortName: COM3 ReadBufferSize: 4096 ReadTimeOut: -1 ReceivedByte: 1 RTSEnable: False StopBits: One WriteBufferSize: 2048 WriteTimeout: -1
:
Bearbeitet durch User
Sind das "echte" ASCII-Zeichenfolgen, seriell verschickt? -Möglicherweise fehlt der Zeilenumbruch am Ende, -oder er darf nicht angehängt werden, -oder man spricht UNIX.
Severin F. schrieb: > Was heißt "echte" ASCII Zeichenfolgen? schieb mal im Original rüber, was der Hersteller dir gegeben hat. Du hast auch weiter oben erwähnt, dass es Beispiele in VB6 gäbe. Da kann man ja auch mal reinsehen, wie das dort gemacht wird.
:
Bearbeitet durch User
Sebastian S. schrieb: > Sind das "echte" ASCII-Zeichenfolgen, seriell verschickt? glaub ich eher nicht. Kein Mensch wäre so dämlich, ein Kommado "Set Relais Ausgang" mit einer Zahl zu codieren anstatt einem Buchstaben. Das wird schon eine echte Binärübertragung sein.
Severin F. schrieb: > es gibt dazu auch beispiele aber alle in VB6 Sieh Dir halt diese Beispiele an. VB6-Code lässt sich mit etwas Gehirnschmalz auch in VB.net-Code übersetzen.
Ich habe auch eine Relaiskarte mit FTDI_Chip. Da musste ein ByteArray mit zwei Feldern übertragen werden, wobei immer nur das erste Byte benutz wurde. Warum auch immer (vielleicht, weil ich eine Karte mit 4 Relais hatte, es vom Hersteller aber auch karten mit 8 Relais gab). Auf jeden Fall sah so die Funktion zum ein-/ausschalten der einzelnen Relais aus (in C# - sollte sich aber einfach an VB.NET anpassen lassen):
1 | private void setRelais(int number, bool on) { |
2 | switch (number) { |
3 | case 0: |
4 | if (on == true) |
5 | {
|
6 | sentBytes[0] = (byte)(sentBytes[0] | 2); |
7 | }
|
8 | else { |
9 | sentBytes[0] = (byte)(sentBytes[0] & 253); |
10 | }
|
11 | break; |
12 | case 1: |
13 | if (on == true) |
14 | {
|
15 | sentBytes[0] = (byte)(sentBytes[0] | 8); |
16 | }
|
17 | else { |
18 | sentBytes[0] = (byte)(sentBytes[0] & 247); |
19 | }
|
20 | break; |
21 | case 2: |
22 | if (on == true) |
23 | {
|
24 | sentBytes[0] = (byte)(sentBytes[0] | 32); |
25 | }
|
26 | else { |
27 | sentBytes[0] = (byte)(sentBytes[0] & 223); |
28 | }
|
29 | break; |
30 | case 3: |
31 | if (on == true) |
32 | {
|
33 | sentBytes[0] = (byte)(sentBytes[0] | 128); |
34 | }
|
35 | else { |
36 | sentBytes[0] = (byte)(sentBytes[0] & 127); |
37 | }
|
38 | break; |
39 | }
|
40 | myFtdiDevice.Write(sentBytes, 1, ref receivedBytes); |
41 | }
|
Sieht so wie ich das sehe ähnlich dem aus, was deine Karte erwartet...
Also vom Verkäufer habe ich das erhalten, was im Anhang steckt. Darunter befindet sich auch die Datei USB 8 Relay Manager v.1.4.exe Man öffnet das Programm klickt auf OPEN RELAY BOARD und dann gehts los. Funktioniert einwandfei! Ich schreibe in Vb.net folgendes Programm für Relais 1: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click SerialPort1.Open() Dim b As Byte() = {1} SerialPort1.Write(b, 0, b.Length) SerialPort1.Close() End Sub Das ganze also mein Programm funktioniert aber NUR wenn ich vorher in der Datei: USB 8 Relay Manager v.1.4.exe auf OPEN RELAY BOARD geklickt habe, dann kann ich alles an das Board senden was ich will. Mache ich das nicht funktioniert gar nichts ich bekomme auch keine Fehlermeldung. Muss ich noch etwas anderes tun ausser den Port zu öffnen? Ich habe wirklich nur die paar Codezeilen die ich hier gepostet habe. Serialport Einstellungen: BaudRate: 9600 DataBits: 8 DiscardNulle: False DTREnable: False Handshake: None Parity: None ParityReplace: 63 PortName: COM3 ReadBufferSize: 4096 ReadTimeOut: -1 ReceivedByte: 1 RTSEnable: False StopBits: One WriteBufferSize: 2048 WriteTimeout: -1 Ich hoffe es kann mir jemand helfen
:
Bearbeitet durch User
Severin F. schrieb: > Muss ich noch etwas anderes tun ausser den Port zu öffnen? Scheint so. Sieh doch mal mit Portmon nach, was das "relay manager"-Programm anstellt, und vergleiche das mit dem, was Dein Programm macht.
Hallo, wenn da nicht nur ein FTDI drauf ist kann ich vielleicht helfen. Wie wäre es mit einem Bild von beiden Seiten? Bei meinen Relaiskarten wird immer ein Byte gesendet. Jedes Bit eines Bytes steht für ein Relais. Ist es gesetzt zieht das Relais an wenn nicht ist es abgefallen. Bin 00000001 = Hex 01 = Dec 01 Bin 00000010 = Hex 02 = Dec 02 Bin 00000100 = Hex 03 = Dec 04 Bin 00001000 = Hex 08 = Dec 08 Bin 00010000 = Hex 10 = Dec 16 Bin 00100000 = Hex 20 = Dec 32 Bin 01000000 = Hex 40 = Dec 64 Bin 10000000 = Hex 80 = Dec 128 Will man Relais 1 und 5 einschalten so sendet man 00010001. Bit 5 und 1 sind gesetzt. Bin 00010001 = Hex 11 = Dec 17. Jetzt brauch man nur noch ein wenig Bitmanipulation und fertig. wert = wert or (oder) Maske setzt das entsprechende Bit, wert = wert and (und) not (negieren) Maske löscht es. Ich denke bei dir stimmt die Baudrate, Parity, Anzahl Stopbits nicht. Oder ich liege total daneben und die Relais hängen an den CBUSxx Anschlüssen. Dagegen spricht aber dein Code:
1 | Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click |
2 | SerialPort1.Open() |
3 | Dim b As Byte() = {1} |
4 | SerialPort1.Write(b, 0, b.Length) |
5 | SerialPort1.Close() |
6 | End Sub |
Wie gesagt Bilder könnten helfen.
>Hersteller FTDIChip (SainSmart) FT245RL
Oh man das habe ich übersehen! Damit sollte dann klar sein das jedes
Byte was gesendet wird den Zustand der Relais ändert. Jetzt braucht man
nur noch die Zuordnung der Ausgänge zu den Relais. Mich würde es wundern
wenn die vertauscht sind. Also Bit 1 Relais 1 usw. Baudrate etc. ist
dann völlig egal.
Auch sehe ich in deinem Code kein
1 | SerialPort1.PortName = "COM1" // 1,2,3,4, .... |
Dir ist schon klar das es mehr wie eine serielle Schnittstelle geben kann? Also Schnittstelle öffnen und genau ein Byte senden und sofort wieder schließen damit die Bytes auch gesendet werden und nicht im Sendebuffer verhungern. Gruß Rene
:
Bearbeitet durch User
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.