HSG |
|
Die folgenden Delphi-Programme enthalten den Protokollfehler, dass die Pause zwischen gesendeten Buchstaben fälschlich nur 2 Dit statt 3 Dit lang ist.
Der Sender hält sich an die bei wikipedia veröffentlichten Details des
Morse-Codes und verwendet auch die
gleiche Syntax für den Sendestring.
MorseSender0.zip
Es folgen Auszüge aus dem Quellcode:
//-------- create (public) --------------------------------------------- constructor TMorseSender.create; begin inherited create; dit := 100; frequenz := 2000; end; //-------- sende (public) ---------------------------------------------- procedure TMorseSender.sende (mstr: string); var i,n : integer; begin n := Length(mstr); for i := 1 to n do begin case mstr[i] of '.' : begin windows.Beep(frequenz,dit); sleep(dit); end; '-' : begin windows.Beep(frequenz,3*dit); sleep(dit); end; ' ' : begin sleep(dit); // 1 dit Pause bereits hinter Symbol . oder - end; '/' : begin sleep(6*dit); // 1 dit Pause bereits hinter Symbol . oder - end; end; // of case end; end;
Das eingehende Signal wird mit Hilfe eine Timers permanent "abgetastet". Es werden immer zwei aufeinander folgende Zustände in alterzustand und zustand gespeichert.
Eine "ansteigende Flanke" kann dann durch (alterzustand = false) and (zustand = true) detektiert werden. Über den QueryPerformanceCounter wird die momentane Systemzeit tauf bestimmt. Geht man zunächst davon aus, dass analog bei der fallenden Flanke tab bestimmt wurde, so kann die Pausenlänge mit pLaenge := tauf - tab; bestimmt werden.
Eine "fallende Flanke" kann dann durch (alterzustand = true) and (zustand = false) detektiert werden. Über den QueryPerformanceCounter wird die momentane Systemzeit tab bestimmt. Geht man zunächst davon aus, dass analog bei der steigenden Flanke tauf bestimmt wurde, so kann die Impulslänge mit iLaenge := tab - tauf; bestimmt werden.
procedure TForm1.Timer1Timer(Sender: TObject); begin zustand := HW.GetEin; if (alterzustand = false) and (zustand = true) // auf then begin QueryPerformanceCounter(n); tauf := n/c; pLaenge := tauf-tab; if (1.5*dit < pLaenge) and (pLaenge < 2.5*dit) then puffer := puffer+' '; if (6*dit < pLaenge) and (pLaenge < 8*dit) then puffer := puffer+'/'; end; if (alterzustand = true) and (zustand = false) // ab then begin QueryPerformanceCounter(n); tab := n/c; iLaenge := tab-tauf; if (0.5*dit < iLaenge) and (iLaenge < 1.5*dit) then puffer := puffer+'.'; if (2.5*dit < iLaenge) and (iLaenge < 3.5*dit) then puffer := puffer+'-'; end; alterzustand := zustand; end;
MorseSender2.zip, exe-Dateien: MorseSender2_1.zip, MorseSender2_2.zip
MorseEmpfaenger3.zip, exe-Dateien: MorseEmpfaenger3_1.zip, MorseEmpfaenger3_2.zip
import threading import time class Timer(threading.Thread): def __init__(self,interval,routine): threading.Thread.__init__(self) self.interval = interval self.routine = routine def run(self): time.sleep(self.interval) self.routine() import serial import sys def zeit(): if sys.platform == 'linux2': return time.time() # fuer Linux else: return time.clock() class Empf(object): def __init__(self,ser,dit=0.1): self.puffer = '' self.s = ser # serielle Schnittstelle self.akt = None # aktueller Zustand self.alt = self.s.getCTS() # alter Zustand self.auf = 0 # Zeit bei ansteigender Flanke self.ab = 0 # Zeit bei abfallender Flanke self.dit = dit # dit-Zeit self.interval = 0.01 # Polling-Intervall self.enabled = True self.timer = Timer(self.interval,self.poll) self.timer.start() def __del__(self): self.s.close() def poll(self): # Pollingroutine self.akt = self.s.getCTS() if not self.alt and self.akt: # ansteigende Flanke self.auf = zeit() pausenlaenge = self.auf - self.ab if 2.5*self.dit < pausenlaenge < 3.5*self.dit: self.puffer = self.puffer + ' ' print(self.puffer) # DEBUG elif 6*self.dit < pausenlaenge < 8*self.dit: self.puffer = self.puffer + '/' print(self.puffer) # DEBUG elif self.alt and not self.akt: # fallende Flanke self.ab = zeit() impulslaenge = self.ab - self.auf if 0.5*self.dit < impulslaenge < 1.5*self.dit: self.puffer = self.puffer + '.' print(self.puffer) # DEBUG elif 2.5*self.dit < impulslaenge < 3.5*self.dit: self.puffer = self.puffer + '-' print(self.puffer) # DEBUG self.alt = self.akt # Polling fortsetzen if self.enabled: self.timer = Timer(self.interval,self.poll) self.timer.start() s = serial.Serial('/dev/ttyS0') e = Empf(s)
Es wurde 'ABC' mit dit = 0,1s gesendet. Bitte beachten, wie der Empfänger ausgeschaltet wird.
>>> . .- .- .- - .- -. .- -.. .- -... .- -... .- -... - .- -... -. .- -... -.- .- -... -.-. e.enabled = False >>>