Asi nerozumiem sériovým portom...

Asi nerozumiem sériovým portom...
« kdy: 11. 05. 2019, 13:53:45 »
Ahojte,

Nemám takmer žiadne skúsenosti so sériovými portami a možno to je dôvod, prečo nie som schopný toto vyriešiť.

Problém: kamarát má zariadenie Emotiv EPOC - taká malá srandička na hlavu, ktorá sníma EEG. K tomu platený, celkom drahý software EmotivPRO. Ten vie zaznamenávať EEG. My potrebujeme do toho posielať markery. To sa dá buď cez klávesnicu, usb alebo sériový port. Tu je pokus o dokumentáciu https://emotiv.gitbook.io/emotivpro/event_markers/serial_port_markers_windows_only , nič podrobnejšie som nenašiel.

Keďže to ide na windowsoch, používam PySerial. Po pár pokusoch sa mi to podarilo pripojiť:
Kód: [Vybrat]
import serial
conn = serial.Serial(port="COM3", baudrate=115200, bytesize=serial.EIGHTBITS, parity=serial.PARITY_MARK, stopbits=serial.STOPBITS_ONE, xonxoff =False)
conn.write(24)
conn.flush()
conn.close()

Nevyhadzuje to žiadnu chybu, ale nezobrazuje ani žiadne markre. S tými parametrami som sa hral, vymieňal, skúšal... Neúspešne.

Na googli sa čo-to dá nájsť, ale nikde žiadna ukážka kódu. Jediné, k čomu sme sa dopracovali je to, že ľudia používajú nejaké aplikácie pre virtuálne sériové porty. Mne to príde, že to je len proxy na prepojenie rôznych zariadení, ktoré vyžadujú iné parametre.

Tak moja otázka je takáto: je to moja chyba? Celkom by som ocenil, keby ste mi len povedali, že som blbec a stačí vymeniť jeden parameter :)


Re:Asi nerozumiem sériovým portom...
« Odpověď #1 kdy: 11. 05. 2019, 14:51:28 »
Sériový port môže používať len jedna aplikácia takže tú od výrobcu vypni. Čo konkrétne tam chceš zapísať iba čísla 24? Skús .write(b"24") aby ti to enkodovalo.

Re:Asi nerozumiem sériovým portom...
« Odpověď #2 kdy: 11. 05. 2019, 16:34:29 »
Ona práve tá aplikácia otvára ten port. A ani nikde v tej aplikácii nie je možnosť to vypnúť. Všetky možnosti súvisiace so sériovým portom sú na tom screenshote

3ugeene

Re:Asi nerozumiem sériovým portom...
« Odpověď #3 kdy: 11. 05. 2019, 19:38:40 »
a co cekas? Nemuzes takhle otevrit jeden port pres dve aplikace a jakoze posilat data z jedny do druhy. Je to PORT ne SBERNICE, takze jen jedno zarizeni na kazdy strane. Potrebujes data posilat od nekud jinud (jiny pocitac nebo jiny zarizeni)

Ochcijes to maximalne tak, ze das do PC dva seriaky, spojis je null-modemem a pak ano, v jedny aplikaci nastavis jeden port a vdruhy druhej a uz si muzou povidat.

Re:Asi nerozumiem sériovým portom...
« Odpověď #4 kdy: 11. 05. 2019, 20:08:38 »
Takže musím vytvoriť nejaký medzibod (na to slúžia tie aplikácie) a aj EmotivPRO, aj môj Python sa pripoja na nejaký COM(nejaké nové číslo). A ten COM3 je v skutočnosti "fake" sériový port, v skutočnosti USB...

Správne?

Občas robím so sieťovými socketmi a tam jeden program počúva a ďalšie sa pripájajú. Takýto divný medzikus môj mozog nejako nepochopil...


Re:Asi nerozumiem sériovým portom...
« Odpověď #5 kdy: 11. 05. 2019, 23:37:33 »
Možná by trochu světla do problematiky vnesl návod k sériové komunikaci z jednoho našeho starého předmětu.  https://support.dce.felk.cvut.cz/pos/cv5/

tecka

  • ***
  • 152
    • Zobrazit profil
    • E-mail
Re:Asi nerozumiem sériovým portom...
« Odpověď #6 kdy: 11. 05. 2019, 23:42:13 »
Sériový port je fyzický port. Není na komunikaci dvou programů.

Citace: rooobertek
Občas robím so sieťovými socketmi a tam jeden program počúva a ďalšie sa pripájajú.
A vznikne tak jedno spojení mezi dvěmi stranami.

Citace: rooobertek
Takýto divný medzikus môj mozog nejako nepochopil...
Tam není žádný divný mezikus. Emotiv čte data ze sériového portu, ke kterému musí být připojené zařízení, které ta data posílá.

Na to abys nemusel požít fyzické zařízení na reálném sériovém portu jsou právě ty virtuální porty. Kdysi jsem na to používal com0com, který vytváří dvojice virtuálních portů fungujícíh jako roura -- data zapsaná do jednoho budou k přečtení na druhém. Netuším jestli to ještě funguje.

Re:Asi nerozumiem sériovým portom...
« Odpověď #7 kdy: 12. 05. 2019, 16:54:01 »
Ďakujem, už som snáď pochopil.
com0com funguje tak napoly. Nainštaloval som to, ale píše mi, že na GUI potrebujem .NET aspoň 2.0. .NET mám, ale 4.niečo, a s tým si nerozumie.
Hneď ako sa opäť dostanem k tomu prístroju, tak to skúsim. Zatiaľ ďakujem za odpovede a za trpezlivosť

Re:Asi nerozumiem sériovým portom...
« Odpověď #8 kdy: 13. 05. 2019, 11:19:03 »
Ohledně nastavení hardwaru sériových portů (UARTů) proti sobě: bacha ať Vám sedí vedle baudu, datových bitů a parity taky flow control. V pythonovém kódu vidím "xonxoff: false" - ale xon/xoff je jenom jedna možnost, jak může flow control běhat (navíc poměrně problematická). Další možnosti jsou "hardware" (aka RTS/CTS) nebo skutečně "none", jak je vidět v té "documentaci" co jste odkázal. Pokud máte proti sobě flow control none/none, tak jede sériák prakticky po třech drátech: RX, TX a zem. Pokud byste zapnul HW flow control = RTS/CTS, tak tím zajistíte odolnost proti přetečení FIFO bufferů na obou UARTech v RX směru, ale potřebujete mít fyzicky zapojené ty dva dráty navíc (RTS a CTS). A samozřejmě pokud byste měl tuhle vlastnost proti sobě navzájem rozkonfigurovanou, tak to nejspíš nebude fungovat vůbec.

Jak říkali ostatní, že se dá bavit po sériáku jenom bod-bod, tak pod Windows existuje kumpán ovladače com0com, user-space prográmek zvaný hub4com - který umí "virtuálně" vytvořit sběrnici. Můžete vzít tři a více COM portů, fyzických nebo virtuálních, a stanovit pravidla, odkud kam se mezi nimi mají kopírovat data - každej s každým, nebo nějakou omezenou podmnožinu.

Nakonec mám ale pocit, že možná špatně chápu zadání. Ten originální software co řeší "markers na sériovém portu" (Emotiv)... podle mého on je s tím headsetem nějak trvale ve spojení. Je mi jedno jak, jestli přes sériák, USB nebo jak... ale vlak proti tomu nejede. Tazatel teď IMO řeší něco jiného: vstup externích událostí do Emotivu. To je další, nezávislý, komunikační kanál. S komunikací mezi Emotiv SW a headsetem to nemůže běžet po tomtéž sériovém portu. Musí být k dispozici (další) dedicated sériák pro Emotiv, na kterém si může povídat s "námi". A ano, ten může být buď fyzický, nebo virtuální. Třeba com0com se na to výborně hodí, z jedné strany dáte Emotiv, z druhé na základní ozkoušení třeba terminál (klasický Hyperterminál bych prakticky úplně nedoporučil, spíš Putty nebo nejlíp RealTerm). A pokud dokážu vyvolat událost posláním pár znaků z terminálu, tak potom zkoušet něco programovat. BTW ono to vypadá, že com0com má víc problémů, než jenom závislost na .NET frameworku 2.0. Ten starý kernelový ovladač údajně už nevoní Windows 10. Takže buď zkusit starší windowsy, nebo koupit nějaký komerční soft, co dělá virtuální COM porty.

Trochu nechápu, proč ten drahý proprietární software neumí přijímat události přes TCP/IP. Třeba přes UDP socket. To je zcela univerzální rozhraní, základními prostředky OS, navíc multiplatformní. Není potřeba kuchat drivery prastarého sériáku do Windows kernelu.

Jako další možnost předávání "zpětnovazebních událostí" (markerů), údajně nepříliš přesnou, zmiňuje dokumentace Emotivu úhozy do klávesnice. Ty se IMO dají vsunout do bufferu softwarově, a to poměrně snadno, každopádně v user space. Zkuste hledat WinAPI funkci SendInput .
Koukám, jestli někdo nemá hotový "keyboard server" pro Windowsy, jako že by něco poslouchalo na socketu a přijaté úhozy vsouvalo do bufferu klávesnice na běžícím desktopu... jako že pro volné další zneužití. Nic takového jsem nenašel, asi nejblíž je serverová část od Air Keyboard App, což asi nebude přímo volně použitelné.

Re:Asi nerozumiem sériovým portom...
« Odpověď #9 kdy: 14. 05. 2019, 06:59:11 »
Že prečo nepoužili sieť, to som si hovoril celý čas, čo som nad tým sedel. Napadli mi dve možnosti: priemyselný standard v odbore, alebo starý programátor, ktorý vie robiť iba so sériovými portami. Ale to sú len moje bezvýznamné domnienky.

Emulácia klávesnice mi tiež prešla hlavou. Ale komplikuje sa to tým, že to okno bude na pozadí a v popredí bude bežať experiment v OpenSesame. Dalo by sa to prebiť použitím dvoch notebookov a siete, ale to už sa výrazne komplikuje.

Re:Asi nerozumiem sériovým portom...
« Odpověď #10 kdy: 14. 05. 2019, 07:22:05 »
Ešte jedna možnosť sa tam črtá. Vraj to vie USB markery.
Podľa názvu by snáď mohlo byť zaujímavé toto: https://github.com/Microsoft/UDE

tecka

  • ***
  • 152
    • Zobrazit profil
    • E-mail
Re:Asi nerozumiem sériovým portom...
« Odpověď #11 kdy: 14. 05. 2019, 08:59:01 »
S USB jsi na tom stejně jako s COM. Buď na něj fyzicky něco připojíš nebo použiješ virtuál. Tak si nějaký vygoogli, je jich hafo, a už to rozchoď.

Re:Asi nerozumiem sériovým portom...
« Odpověď #12 kdy: 14. 05. 2019, 22:42:46 »
Velmi teoreticky, SendInput vsunuje fiktivní úhozy do globální klávesnicové fronty. Pak ale existuje ještě možnost, poslat je v podobě "window messages" přímo konkrétnímu oknu. A jestli správně chápu, tak potom záleží na aplikaci, jestli bude klávesnicové zprávy přijímat i ve stavu, kdy nemá focus / kdy není v popředí. (Třeba notepad v takovém případě klávesnicové vstupy údajně ignoruje.)

https://www.unknowncheats.me/forum/c-and-c-/90799-send-input-active-window.html

https://stackoverflow.com/questions/10631149/ignore-mouse-click-and-send-keyboard-input-to-external-application

Ale souhlas, je to už dost přes koleno.
Napadá mě, že nějaký jednoduchý "proof of concept" (s tím injektováním kláves) by se možná dal spáchat v AutoHotKey.

A pak mě napadá, že ovladač virtuálního sériáku se vyskytuje taky ve variantě "virtuální COM napojený na socket" - ale opět podle mého není k dispozici aktuální implementace zadarmo.