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.