Serielle Schnittstelle für Funkgerät
Verfasst: 08.07.2007 11:25
Nachdem ich mich entschlossen hatte, keine Userlibs mehr zu verwenden, musste auch für MVCOM (das bestens funktioniert hat) ein Ersatz her.
Folgenden Code habe ich zusammengestellt, vielleicht kann ihn der eine oder andere gebrauchen.
Zur Erklärung: CommTS2KCtrl steuert ein Funkgerät, CommCWKey nutzt von der Schnittstelle nur das DTR-Signal zur Ausgabe von Morsezeichen.
Beide sind keine originalen seriellen Schnittstellen, sondern USB/seriell Konverter.
In der Prozedure CommTS2KCtrlOut wird an den zu sendenden String ein ";" angehängt, weil das die Befehlssyntax des Funkgeräts erfordert.
Mit CommTS2KCtrlIn wird die Antwort des Funkgeräts abgefragt und in sRigDat abgelegt.
Folgenden Code habe ich zusammengestellt, vielleicht kann ihn der eine oder andere gebrauchen.
Code: Alles auswählen
; Serielle Schnittstelle
Global lCommTS2KCtrl.l
Global lCommCWKey.l
Global lRes.l
Global *CommRecBuf.l = AllocateMemory(256)
Global sRigDat.s
Procedure SetCommPort(lCommPort.l, lFlags.l)
Define.DCB dcb
Define.COMMTIMEOUTS cto
GetCommState_(lCommPort, @dcb)
dcb\BaudRate = #CBR_57600
dcb\Parity = #NOPARITY
dcb\StopBits = #ONESTOPBIT
dcb\ByteSize = 8
dcb\fBits = (dcb\fBits & %11111111111111111000000000000000) | lFlags
SetCommState_(lCommPort, @dcb)
Delay(1)
cto\ReadIntervalTimeout = 100
cto\ReadTotalTimeoutMultiplier = 10
cto\ReadTotalTimeoutConstant = 100
cto\WriteTotalTimeoutMultiplier = 100
cto\WriteTotalTimeoutConstant = 10
SetCommTimeouts_(lCommPort, @cto)
Delay(1)
EndProcedure
Procedure OpenCommPorts()
Define.s sCommDev1 = "COM2:"
Define.s sCommDev2 = "COM3:"
Dim fBits.b(14)
fBits(0) = #True ; fBinary
fBits(1) = #False ; fParity
fBits(2) = #False ; fOutxCtsFlow
fBits(3) = #False ; fOutxDsrFlow
fBits(4) = #DTR_CONTROL_DISABLE ; fDtrControl
fBits(6) = #False ; fDsrSensitivity
fBits(7) = #False ; fTXContinueOnXoff
fBits(8) = #False ; fOutX
fBits(9) = #False ; fInX
fBits(10) = #False ; fErrorChar
fBits(11) = #False ; fNull
fBits(12) = #RTS_CONTROL_ENABLE ; fRtsControl
fBits(14) = #False ; fAbortOnError
Define.l lSI, lFlags
For lSI = 0 To 14
lFlags + fBits(lSI) * Pow(2, lSI) ; Multipliziert jedes FlagBit mit dem Stellenwert und addiert auf
Next
lCommTS2KCtrl = CreateFile_(@sCommDev1, #GENERIC_ALL, 0, #Null, #OPEN_EXISTING, #FILE_ATTRIBUTE_NORMAL, #Null)
If lCommTS2KCtrl
SetupComm_(lCommTS2KCtrl, 255, 255)
SetCommPort(lCommTS2KCtrl, lFlags)
Else
MessageRequester("", "Comm2 wurde nicht geöffnet")
EndIf
lCommCWKey = CreateFile_(@sCommDev2, #GENERIC_ALL, 0, #Null, #OPEN_EXISTING, #FILE_ATTRIBUTE_NORMAL, #Null)
If lCommCWKey
SetupComm_(lCommCWKey, 0, 0)
lFlags = 0
fBits(12) = #RTS_CONTROL_DISABLE
For lSI = 0 To 14
lFlags + fBits(lSI) * Pow(2, lSI)
Next
SetCommPort(lCommCWKey, lFlags)
Else
MessageRequester("", "Comm3 wurde nicht geöffnet")
EndIf
EndProcedure
Procedure CommTS2KCtrlIn()
Define.l lReadBytes
ReadFile_(lCommTS2KCtrl, *CommRecBuf, 256, @lReadBytes, 0)
sRigDat = PeekS(*CommRecBuf, lReadBytes)
PurgeComm_(lCommTS2KCtrl, #PURGE_RXCLEAR)
Delay(1)
EndProcedure
Procedure CommTS2KCtrlOut(TXString.s)
Define.l lWritten
TxString + ";"
PurgeComm_(lCommTS2KCtrl, #PURGE_RXCLEAR)
WriteFile_(lCommTS2KCtrl, @TxString.s, Len(TxString), @lWritten, 0)
PurgeComm_(lCommTS2KCtrl, #PURGE_TXCLEAR)
Delay(1)
EndProcedure
Procedure.l CommSetDTR(lDTRState.l)
If lDTRState
lRes = EscapeCommFunction_(lCommCWKey, #SETDTR)
Else
lRes = EscapeCommFunction_(lCommCWKey, #CLRDTR)
EndIf
ProcedureReturn lRes
EndProcedure
Beide sind keine originalen seriellen Schnittstellen, sondern USB/seriell Konverter.
In der Prozedure CommTS2KCtrlOut wird an den zu sendenden String ein ";" angehängt, weil das die Befehlssyntax des Funkgeräts erfordert.
Mit CommTS2KCtrlIn wird die Antwort des Funkgeräts abgefragt und in sRigDat abgelegt.