Seite 1 von 1

Serielle Schnittstelle für Funkgerät

Verfasst: 08.07.2007 11:25
von drahneir
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.

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

Verfasst: 08.07.2007 11:28
von Kaeru Gaman
sowas passt besser ins CT&T-unterforum, habs mal verschoben.

als zehnten Beitrag gleich so nen code, respekt. :allright:

bei der gelegenheit, nachträglich willkommen im board. :D

Verfasst: 08.07.2007 18:46
von Falko
Kaeru Gaman hat geschrieben:sowas passt besser ins CT&T-unterforum, habs mal verschoben.

als zehnten Beitrag gleich so nen code, respekt. :allright:

bei der gelegenheit, nachträglich willkommen im board. :D
Sag jetzt nicht, das war in der Hardwareecke :oops: :lol:

Gruß Falko

Verfasst: 08.07.2007 18:52
von ts-soft
Falko hat geschrieben:Sag jetzt nicht, das war in der Hardwareecke :oops: :lol:

Gruß Falko
Da es wohl nur mit Anpassungen normal nutzbar ist, würde ich sagen:
Ergänzen mit Infos zum Funkgerät und dann in die Hardwareecke, dann ist
es in jedemfall eindeutig :wink:

Verfasst: 08.07.2007 20:02
von Falko
Ich habs dann in die Hardwareecke verschoben und den Schatten gelassen . :lol:

Gruß ..Falko