CW - Amateurfunk-Station DK1IO

Direkt zum Seiteninhalt

Hauptmenü

CW

CW ist die älteste Funkbetriebsart und erfreut sich nach wie vor großer Beliebtheit. Gerade weil es nicht jeder kann, verleiht es dem Kundigen eine gewisse 'Exklusivität'. Wir sollten stolz darauf sein, dass der Amateurfunk der einzige Funkdienst ist, in dem die Morsetelegrafie weiterhin gepflegt wird.

CW mit dem PC

Nachdem der PC Einzug in die Shacks der Funkamateure gehalten hat, ist auch CW in den Fokus der Programmierer geraten. Es wurden Anwendungen zum automatischen Dekodieren von CW entwickelt. Welchen praktischen Nutzen solche Programme haben, vermag ich nicht zu beurteilen, da ich noch keines benutzt habe. Auf der Sendeseite aber habe ich Hand angelegt, und ein Programm zum automatischen Aussenden beliebiger Texte in CW entwickelt. Genau wie in PSK erhöht das manuelle Geben ständig gleichbleibender Texte nicht die Authentizität. Und es entlastet den Operator doch etwas, wenn er z. B. die Stationsbeschreibung per Mausklick senden lässt und währenddessen noch einen Schluck Kaffee trinken kann.
Ich habe ein kleines Testprogramm für die Morseausgabe geschrieben. Geignet ist das Programm für Elecraft- und Kenwood-Geräte.
Herzstück des Programms ist der CAT-Befehl "KY [Text];" Dieser ermöglicht die Ausgabe von 24 Zeichen. Längere Texte werden vom PC in Blöcke zu 24 Zeichen umgewandelt. Die Umwandlung in Morsezeichen geschieht im Transceiver. Dadurch ist der Aufwand auf der Rechnerseite gering. Kleiner Wermutstropfen: der KY-Befehl kennt keine Umlaute.
Wer Gefallen an dem Programm findet, kann es für seine Zwecke erweitern und sinnvolle Texte wie CQ-Ruf und Stationsbeschreibung verwenden.
Ein
CW-Log- und Steuerprogramm mit dieser Morseausgabe  ist unter Programme/IOLog CW beschrieben

Die einzige vorzunehmende Änderung ist die Anpassung der CommPort-Bezeichnung sowie der Baudrate
Die Geschwindigkeit kann mit dem Mausrad zwischen 10 WpM und 30 WpM variiert werden, wenn sich der Cursor in dem hellblauen Feld befindet.

Die Bedienoberfläche des CW-Testprogramms



Das Programm

; Programm zum Testen der Morseausgabe
; Vers. 190817
; DK1IO 2019

EnableExplicit

#BtnClr = $E6F5FD
#LBlue  = $FBEAC1

Enumeration
 #Wnd_CW
 #DB
 #COM_FG
 #Btn_Stop
 #Btn_Text1
 #Btn_Text2
 #Txt_WpM
 #Tmr_TX
EndEnumeration

Define Text1$ = "Dies ist ein Test der Morseausgabe"
Define Text2$ = "1234 5678 9876 5432 1234 5678"
Global hCOM_FG
Global pnt1.POINT
Global rct1.RECT
Global lMW_wParam.l
Global iMW_Vz, iTxtBtn, i

Global *CommBuf = AllocateMemory(64)

Procedure MorseAusg(Text$, GadgetNr)
 If Not (GetGadgetColor(#Btn_Text1, #PB_Gadget_BackColor) = #Red Or GetGadgetColor(#Btn_Text2, #PB_Gadget_BackColor) = #Red)
   iTxtBtn = GadgetNr
   SetGadgetColor(GadgetNr, #PB_Gadget_BackColor, #Red)
   For i = 1 To Len(Text$) Step 24
     WriteSerialPortString(#COM_FG, "KY " + Mid(Text$, i, 24) + ";")
   Next
   AddWindowTimer(#Wnd_CW, #Tmr_TX, 300)
 EndIf
EndProcedure

hCOM_FG = OpenSerialPort(#COM_FG, "COM1", 38400, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 64, 64)          ; Hier den CommPort und die Baudrate anpassen
If Not hCOM_FG
 MessageRequester("Fehler", "Der CommPort konnte nicht geöffnet werden")
 End
EndIf
WriteSerialPortString(#COM_FG, "MD3;") : WriteSerialPortString(#COM_FG, "VX1;")

If OpenWindow(#Wnd_CW, 0, 0, 600, 335, "CW-Ausgabe", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
 TextGadget(#Btn_Text1, 133, 100, 100, 35, "Text 1", #WS_BORDER | #PB_Text_Center | #SS_CENTERIMAGE | #SS_NOTIFY)
 SetGadgetColor(#Btn_Text1, #PB_Gadget_BackColor, #BtnClr)
 TextGadget(#Btn_Text2, 366, 100, 100, 35, "Text 2", #WS_BORDER | #PB_Text_Center | #SS_CENTERIMAGE | #SS_NOTIFY)
 SetGadgetColor(#Btn_Text2, #PB_Gadget_BackColor, #BtnClr)
 ButtonGadget(#Btn_Stop, 133, 200, 100, 35, "Stop")
 TextGadget(#Txt_WpM, 366, 200, 100, 35, "20 WpM", #WS_BORDER | #PB_Text_Center | #SS_CENTERIMAGE)
 SetGadgetData(#Txt_WpM, 20)
 SetGadgetColor(#Txt_WpM, #PB_Gadget_BackColor, #LBlue)
EndIf

Define int1, EventNr, GadgetNr
 
Repeat
 EventNr  = WaitWindowEvent()
 GadgetNr = EventGadget()
 Select EventNr
   Case #PB_Event_Timer
     PurgeComm_(hCOM_FG, #PURGE_RXCLEAR)
     WriteSerialPortString(#COM_FG, "IF;")
     Delay(25)
     ReadSerialPortData(#COM_FG, *CommBuf, 29)
     If Right(PeekS(*CommBuf, 29, #PB_Ascii), 1) = "0"
       SetGadgetColor(iTxtBtn, #PB_Gadget_BackColor, #BtnClr)
       RemoveWindowTimer(#Wnd_CW, #Tmr_TX)
     EndIf
   Case #WM_MOUSEWHEEL
     GetCursorPos_(pnt1)
     GetWindowRect_(GadgetID(#Txt_WpM), rct1)
     If PtInRect_(rct1, PeekQ(pnt1))
       lMW_wParam = EventwParam()
       iMW_Vz = lMW_wParam / Abs(lMW_wParam)
       int1 = GetGadgetData(#Txt_WpM) + iMW_Vz
       Select int1
         Case 31
           int1 = 30
         Case 9
           int1 = 10
       EndSelect
       SetGadgetData(#Txt_WpM, int1)
       SetGadgetText(#Txt_WpM, Str(int1) + " WpM")
       WriteSerialPortString(#COM_FG, "KS0" + Str(int1) + ";")
     EndIf
   Case #PB_Event_Gadget
     Select GadgetNr
       Case #Btn_Text1
         Morseausg(Text1$, GadgetNr)
       Case #Btn_Text2
         MorseAusg(Text2$, GadgetNr)
       Case #Btn_Stop
         SetSerialPortStatus(#COM_FG, #PB_SerialPort_RTS, 1)
         Delay(10)
         SetSerialPortStatus(#COM_FG, #PB_SerialPort_RTS, 0)
         SetGadgetColor(iTxtBtn, #PB_Gadget_BackColor, #BtnClr)
         RemoveWindowTimer(#Wnd_CW, #Tmr_TX)
     EndSelect
 EndSelect
Until EventNr = #PB_Event_CloseWindow

Zurück zum Seiteninhalt | Zurück zum Hauptmenü