Morze kód

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
learner
DrótVégénSzéndarab
Hozzászólások: 24
Csatlakozott: 2017. november 4. szombat, 16:41

Re: Morze kód

HozzászólásSzerző: learner » 2018. október 6. szombat, 9:38

Úgy oldottam meg, hogy, csináltam egy ilyet:

Kód: Egész kijelölése

constexpr uint16_t spaceLengthMs = dotLengthMs * 7u;

és a CharToMorse függvény után bebiggyesztettem ezt:

Kód: Egész kijelölése

if (aChar == 32) {delay(spaceLengthMs);}

Így most már a szavakat el lehet választani egymástól, de a szavakon belüli betűket nem. Eddig nem vettem észre, mert tudtam, hogy a szó amit beírtam milyen betűkből épül fel és betűnként ellenőriztem le a táblázatból. Például az alma Morze kóddal leírva így néz ki: .-.-..--.- Ez lehetne lefordítva AAIMA, ETETIGT stb. A betűk között nincs annyi idő, hogy el lehessen őket különíteni.

vargham
Pákabűvész
Hozzászólások: 246
Csatlakozott: 2014. január 8. szerda, 8:32
Kapcsolat:

Re: Morze kód

HozzászólásSzerző: vargham » 2018. október 6. szombat, 10:53

Így most már a szavakat el lehet választani egymástól, de a szavakon belüli betűket nem.

Ez nekem furcsa.

Kód: Egész kijelölése

//Ez villogja el az adott karektert.
void charToMorse(char aChar) {
    uint8_t morseIndex = getIndex(aChar); // Megkérdezzük, hol van a tömbben a kért karakter Morze kódja
    if (morseIndex < characterCount) { // Ha a válasz a tömbön belül van, akkor ok, ha nem, akkor nem ismert karakterről van szó.
       for (int i = 0; i < morseChars[morseIndex].length; i++) {
          digitalWrite(outPin, HIGH); // Bekapcsoljuk a kimenetet
          if (((morseChars[morseIndex].pattern >> i) & 1) == 1) { // Megnézzük a pattern i. bit értékét, ha 1, akkor hosszú várakozás kell, mert hosszú (vonás) ideig kell bekapcsolva hagyni a kimenetet
            delay(dashLengthMs);
          }
          else {
            delay(dotLengthMs); // A bit 0, rövid várakozás.
          }
          digitalWrite(outPin, LOW); // Lekapcsoljuk a kimenetet
          delay(dotLengthMs); // Jelköz szünet.
       }
    }
}


Ez a sor:
delay(dotLengthMs); // Jelköz szünet.
Elvileg szüntetet rak minden karakter után.

learner
DrótVégénSzéndarab
Hozzászólások: 24
Csatlakozott: 2017. november 4. szombat, 16:41

Re: Morze kód

HozzászólásSzerző: learner » 2018. október 6. szombat, 15:51

Próbáltam változtatni rajta, de csak a hosszú és rövid jel közti szünetet állítja. Nekem pedig arra lenne szükségem, hogy miután egy betűt elvillogott utána szünetet tartson és kezdje a következő betűt.

vargham
Pákabűvész
Hozzászólások: 246
Csatlakozott: 2014. január 8. szerda, 8:32
Kapcsolat:

Re: Morze kód

HozzászólásSzerző: vargham » 2018. október 6. szombat, 16:21

Igazad van, az a jelköz, amit beleraktam. Kell még karakter köz is.

vargham
Pákabűvész
Hozzászólások: 246
Csatlakozott: 2014. január 8. szerda, 8:32
Kapcsolat:

Re: Morze kód

HozzászólásSzerző: vargham » 2018. október 6. szombat, 16:26

Beleraktam a karakterek közötti szünetet is.

Kód: Egész kijelölése

//Ez villogja el az adott karektert.
void charToMorse(char aChar) {
    uint8_t morseIndex = getIndex(aChar); // Megkérdezzük, hol van a tömbben a kért karakter Morze kódja
    if (morseIndex < characterCount) { // Ha a válasz a tömbön belül van, akkor ok, ha nem, akkor nem ismert karakterről van szó.
       for (int i = 0; i < morseChars[morseIndex].length; i++) {
          digitalWrite(outPin, HIGH); // Bekapcsoljuk a kimenetet
          if (((morseChars[morseIndex].pattern >> i) & 1) == 1) { // Megnézzük a pattern i. bit értékét, ha 1, akkor hosszú várakozás kell, mert hosszú (vonás) ideig kell bekapcsolva hagyni a kimenetet
            delay(dashLengthMs);
          }
          else {
            delay(dotLengthMs); // A bit 0, rövid várakozás.
          }
          digitalWrite(outPin, LOW); // Lekapcsoljuk a kimenetet
          if (i == morseChars[morseIndex].length - 1) { // Ha ez volt az utolsó jel a karakteren belül
            delay(dashLengthMs); // Karakter köz szünet.
          }
          else { // Ha ez egy karakteren belüli jel volt
            delay(dotLengthMs); // Jelköz szünet.
          }
       }
    }
}


Most még az kellene, hogy ne használjon delay-t, és villogás közben is tudjon karakterekt fogadni. Az Arduino Serial class az pufferel valamennyit, nem?

learner
DrótVégénSzéndarab
Hozzászólások: 24
Csatlakozott: 2017. november 4. szombat, 16:41

Re: Morze kód

HozzászólásSzerző: learner » 2018. október 6. szombat, 17:27

Szuper most már működik. :D Igen, pufferel de nem tudom mennyit az biztos, hogy nem keveset. A delay-t ki lehetne venni belőle, meg is fogom próbálni, már csináltam olyan programot amiben nem használok delay-t igaz csak minták alapján tudtam összerakni. Arra gondoltam, hogy van itthon kettő HC-12-es modulom arduino alaplap is van bőven és az egyik a szöveget elküldené a másiknak ami pedig elvillogja. Meg aztán az is érdekelne hogy a soros monitor nélkül, hogy tudnék szöveget elküldeni lefordításra. Pl.: Parancssorból megoldható lenne vagy mondjuk egy kis batch fájlal? :?: :?: Bár fölösleges ezen még gondolkodnom mert nincs meg nekem hozzá a megfelelő háttértudásom.


Vissza: “Arduino / C-nyelvű programozás (AVR-Duino, EthDuino, Arduino, Diecimila)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 2 vendég