Több karakter küldése(soros port)

Több karakter küldése(soros port)
2015-01-09T19:31:30+01:00
2015-01-10T23:01:29+01:00
2022-12-02T01:30:35+01:00
xNorbi
Helló

Adott egy quadcopter, hozzá egy bluetooth modul ehhez a modulhoz csatlakozik a notebookom bluetootha amit én soros portként látok(COM5). Ezen keresztül szeretném irányítani, erre több terminal program létezik amivel ezt megtudom valósítani és írtam saját programot, de mindnek van egy nagy hibája:

Nem úgy működik, mint ahogy egy játékban megvan szokva rá az ember, hanem inkább afféle szövegszerkesztő módban(mintha a wordben írnák), ha lenyomom a w betűt küld egy karaktert majd kicsit semmi aztán elkezd jó sok w írni egymás után.
Másik probléma vele, ha mondjuk egyszerre előre és jobbra is szeretnék menni, akkor hiába nyomom meg egyszerre mindig csak az egyik irányt regisztrálja. Így olvasom ki:

while(1) { if(kbhit()) { gets(dataout); WriteFile(hCom, &dataout,1, &Pocet, NULL); printf("%d ", &dataout); } }
Hogy tudnám megszüntetni ezt a "LAG"-ot az elején, illetve hogy tudnék egyszerre több lenyomott billentyűt is elküldeni(egymás után felváltva-így lenne a legideálisabb)? Köszi
Mutasd a teljes hozzászólást!
Én még 1 lépéssel tovább mennék, és NEM azt nézném, hogy MIKOR nyomják le, hanem, hogy LE van-e nyomva.

Azaz a program kezdetétől folyamatosan futna egy időzítő függvény, mondjuk 50 milliszekundumonként, és abban  azt vizsgálnád, hogy LE VAN-e nyomva adott billentyű.
Ha igen, akkor hozzáfűzöd egy String-hez és amikor végignézted az összeset, akkor egyben elküldöd a stringet.
Ha Lenyomva('W') >> s := s + 'w';

Nem tudom, ez milyen programnyelven van, de
 - vagy azt kell kiderítened, hogyan tudod egy-egy billentyű állapotát lekérdezni
 - vagy külön eseményként figyelni a lenyomást ÉS felengedést. (És azok szerint állítasz egy tömb elemét True-ra vagy False-ra. Minden billentyűhöz tartozna egy tömb elem.)
Ez utóbbi azért "veszélyes", mert ha véletlenül elmulasztasz egy FELengedés eseményt, akkor úgy veszi, mintha még mindig nyomnád ...
Mutasd a teljes hozzászólást!

  • Szia.
    Az elméletét írnám le... Külön kell választanod a billentyűzetről való beolvasást és a soros port írását. Nem írhatod közvetlenül a portra amit beolvasol.
    Ha leütnek egy W betűt akkor abban a pillanatban meg kell hívnod egy függvényt ami folyamatosan mondjuk tized másodperces időzítéssel folyamatosan írja azt a soros portra. Közben vizsgálod, hogy jön e be további W karakter, ha mondjuk 3 tized másodperce nem jött be W karakter akkor megszünteted az írást.
    Ha más billentyűt is leütöttek akkor ezt is hozzá kell fűznöd az íráshoz WDWDWDWD ... de a billentyűzetről közben csak ezt fogod látni, hogy wwwwwwwdddddddddd (próbáld ki egy sima szövegszerkesztőben)... ezt neked kell függvényekkel lekezelni mikor mit írjon a portra a programod.
    Mutasd a teljes hozzászólást!
  • Köszi a választ ki fogom próbálni. De mi van abban a helyzetben ha lenyomom a W billenytűt, majd a D billentyűt majd elengedem a D billentyűt akkor ezt kapom:

    wwwwwwwddddddddddd

    Függetlenül attól hogy a W billentyűt nyomva tartom a D billentyű elengedése után vagy nem, nem ír semmit. Itt hogy tudom megállapítani hogy nyomva-e van még a W billentyű?
    Mutasd a teljes hozzászólást!
  • Én még 1 lépéssel tovább mennék, és NEM azt nézném, hogy MIKOR nyomják le, hanem, hogy LE van-e nyomva.

    Azaz a program kezdetétől folyamatosan futna egy időzítő függvény, mondjuk 50 milliszekundumonként, és abban  azt vizsgálnád, hogy LE VAN-e nyomva adott billentyű.
    Ha igen, akkor hozzáfűzöd egy String-hez és amikor végignézted az összeset, akkor egyben elküldöd a stringet.
    Ha Lenyomva('W') >> s := s + 'w';

    Nem tudom, ez milyen programnyelven van, de
     - vagy azt kell kiderítened, hogyan tudod egy-egy billentyű állapotát lekérdezni
     - vagy külön eseményként figyelni a lenyomást ÉS felengedést. (És azok szerint állítasz egy tömb elemét True-ra vagy False-ra. Minden billentyűhöz tartozna egy tömb elem.)
    Ez utóbbi azért "veszélyes", mert ha véletlenül elmulasztasz egy FELengedés eseményt, akkor úgy veszi, mintha még mindig nyomnád ...
    Mutasd a teljes hozzászólást!
  • Na sikerült megoldanom a problémát, leírom hátha valakinek hasznos lesz majd valamikor.
    A megoldás kulcsa a GetKeyState funkció bővebben: msdn.microsoft.com... 

    Amit így használlok:

    while(1) { if( GetKeyState(0x57) & 0x8000 ) dataout[0]='w';//W if( GetKeyState(0x41) & 0x8000 ) dataout[1]='a';//A if( GetKeyState(0x53) & 0x8000 ) dataout[2]='s';//S if( GetKeyState(0x44) & 0x8000 ) dataout[3]='d';//D if( GetKeyState(0x45) & 0x8000 ) dataout[4]='e';//E if( GetKeyState(0x52) & 0x8000 ) dataout[5]='r';//R if( GetKeyState(0x43) & 0x8000 ) dataout[6]='c';//C if( GetKeyState(0x21) & 0x8000 ) dataout[6]='+';//PUp if( GetKeyState(0x22) & 0x8000 ) dataout[7]='-';//PDown WriteFile(hCom,&dataout,8,&x,NULL); printf("%s", dataout); Sleep(25); for(int i=0;i<8;i++) dataout=':' }
    Így 3karaktert tudok egyszerre lenyomni és rögtön küldi őket(mint valamilyen játékban), szóval minden problémám megoldódott.
    Mutasd a teljes hozzászólást!
  • Mutasd a teljes hozzászólást!
  • [OFF]
    Örülök, hogy működött a javaslatom.
    NevemTeve tanácsa ígéretes fejlesztési lehetőséget rejt magában. Ne állj meg itt, fejleszd még tovább ;) Gyakorlat teszi a mestert.
    Mutasd a teljes hozzászólást!
  • Igen nem állok le, még van mint javítani rajta még elég erőforrás pazarlónak érzem, de ez amolyan szükségmegoldás volt míg meg nem jön a rendes távirányító. Nehézkes is így irányítani analóg karok nélkül főleg szobában.
    És amint látom még jobb funkció is van :) köszi!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd