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
privatevoidsetRelais(intnumber,boolon){
2
switch(number){
3
case0:
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
case1:
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
case2:
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
case3:
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,refreceivedBytes);
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:
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