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
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.
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
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 kein1 | 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
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.