Ich habe nun die Adapter von Reichelt bekommen. Nun werden mir die Signale auch korrekt am Check Tester angezeigt.
Nun sieht das so aus:
TD, RTS und DTR zeigen beim Einstecken des USB2Seriell-Adapter grün an. Der die restlichen LEDS bleiben aus.
Grün bedeutet, das die Signale auf inaktiv gesetzt sind. Sobald ich das nachfolgende Programm laufen lasse, wobei zuerst 10mal
das RTS ein-, (rote LED) und dann wieder ausgeschaltet (grüne LED). Dabei wird das DTR dann auf Rot gesetzt. Nach der ersten Messagebox folgt das 10x Schalten der DTR-Leitung. Diese wird dann abwechselnd von Rot auf Grün geschaltet. Also bei mir lassen sich so
dann beide Signale manuell schalten, ohne Com beenden zu müssen. Also müsste in erster Erkenntnis die Steuerung manuell verlaufen.
da ich mir auch die Adapter für die Gegenseite dazu bestellt hatte, will ich nachher mein Programm auf beide Seiten testen, indem ich eine weiteren USB2Seriel-Adapter verbinde. Dazwischen werde ich dann das Nullmodemkabel was ich bei den letzteren Tests probiert hatte verbinden. Dann bin ich mal gespannt, ob die Steuerung automatisch funktioniert oder nicht.
Hier nochmal die etwas abgeänderte Version aus den vorherigen Einträgen. Dabei habe ich nun Daniel einen schönen Code bekommen, der
das OpenSerialPort() für Stopbit mappt, womit man wie in der Api als auch in anderen Hochsprachen diesen als Integer und nicht wie in PB als Float verwenden kann. Mir ist dieses lieber, da ich diese viel einfacher über Combobox und PreferenceWrite als auch Read nutzen kann, ohne zusätzlich die Floats, 1, 1.5 und 2 speichern zu müssen. Ich habe bei mir die PreferenzesLongs benutzt und kann somit alle Indexierungen der Combobox nutzen. Also keine Umwandlung etc.
Gruß,
Falko
Testprogramm für das Ansteuern von RTS und DTR
Code: Alles auswählen
Enumeration
#StopBits_One
#StopBits_OneAndHalf
#StopBits_Two
EndEnumeration
;Procedure von DarkDragon womit das StopBit nun als Integer gemappt wird. Dank an Daniel.
Procedure.i OpenSerialPortEx(SerialPort.i, PortName.s, Bauds.i, Parity.i, DataBits.i, StopBits.i, HandshakeMode.i, InputBufferSize.i, OutputBufferSize.i)
Protected FloatStopBits.f = PeekF(?FloatByIntStopBit + StopBits * SizeOf(Float))
ProcedureReturn OpenSerialPort(SerialPort, PortName, Bauds, Parity, DataBits, FloatStopBits, HandshakeMode, InputBufferSize, OutputBufferSize)
DataSection
FloatByIntStopBit:
Data.f 1.0
Data.f 1.5
Data.f 2.0
EndDataSection
EndProcedure
Macro OpenSerialPort(SerialPort, PortName, Bauds, Parity, DataBits, StopBits, HandshakeMode, InputBufferSize, OutputBufferSize)
OpenSerialPortEx(SerialPort, PortName, Bauds, Parity, DataBits, StopBits, HandshakeMode, InputBufferSize, OutputBufferSize)
EndMacro
Port$="COM4"
#SerialPort=0
;Handshake.l=#PB_SerialPort_NoHandshake
;Handshake.l=#PB_SerialPort_RtsCtsHandshake
Handshake.l=#PB_SerialPort_RtsHandshake
;Handshake.l=#PB_SerialPort_XonXoffHandshake
Parity.l=#PB_SerialPort_NoParity; #PB_SerialPort_EvenParity;
If OpenSerialPortEx(#SerialPort, Port$, 9600, Parity , 8, #StopBits_One , Handshake , 1024, 1024)
Schalter = 1
For i = 1 To 10
SetSerialPortStatus(#SerialPort, #PB_SerialPort_RTS, Schalter)
Delay(1000)
;Compilereinstellungen den inlineAsembler einschalten nicht vergessen!
Schalter=Schalter Not Schalter
Debug Schalter
Next i
MessageRequester("Error", "serial port is ok: "+Port$)
For i = 1 To 10
SetSerialPortStatus(#SerialPort, #PB_SerialPort_DTR, Schalter)
Delay(1000)
;Compilereinstellungen den inlineAsembler einschalten nicht vergessen!
Schalter=Schalter Not Schalter
Debug Schalter
Next i
MessageRequester("Error", "serial port is ok: "+Port$)
Else
MessageRequester("Error", "Can't open the serial port: "+Port$)
EndIf
;CloseSerialPort(#SerialPort); Der Debugger wird hiermit nur gestört, warum auch im PB-Beispiel
;dieser Befehl nicht vorhanden ist. Scheint ein Bug des Debuggers zu sein.
[Edit]
So wie es aussieht funktioniert die Datenübertragung ohne CTS-Abfrage usw. auch mit RTS/CTS-Handshake
automatisch. Zumindesten schalten die LEDS der jeweiligen Leitung CTS als auch RTS automatisch auf aktiv (rote LED)
Nach Überprüfen mit PSPAD TEXTDiff, musst ich doch feststellen, das zwei Zeilen bei einem 1000-zeiligen Programm einmal Ziffern versechsfach wurden oder der Text um einen Buchstaben mehrfach erweitert wurde.
Also muss ich die Abfrage von CTS usw. wohl besser mit einbinden.
[/Edit]
Gruß,
Falko