Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Komunikace přes sériový port v C

Aktivity
Avatar
Bertram
Člen
Avatar
Bertram:13.7.2015 17:51

Ahoj, nevíte někdo, kde bych se o tom mohl něco dočíst, nejlépe v češtině?
Jde mi hlavně o to, jak navázat komunikaci, nastavit ji a jakým způsobem komunikovat.
Zatím jsem dělal různé pokusy již z hotovými nástroji pro komunikaci, jako jsou modScan atd., ale chtěl bych toto spojení s různými zařízeními zvládnout bez těchto nástrojů.

 
Odpovědět
13.7.2015 17:51
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Bertram
Martin Dráb:13.7.2015 19:25

Ahoj,

pokud nepožaduješ multiplatformnost a stačí ti, aby komunikující program běžel na Windows, mrkni sem:
https://msdn.microsoft.com/…f802693.aspx

V zásadě se se sériovým portem pracuje jako s libovolným jiným souborem (uvážíme-li, že ti ke štěstí stačí jen zápis a čtení a na seekování si necháš zajít chuť). To znamená, že jej otevřeš (název zařízení je COMX, kde X je číslo portu. Pokud používáš k otevření fce CreateFile/Open­File, uváděj jméno jako \\.\COMX), provádíš čtení a zápisy... a pak daný "soubor" zavřeš (na Windows přes fci CloseHandle).

Obvykle je před prvním čtením/zápisem nutné nastavit baudrate, paritu, počet stop bitů, počet datových bitů (možná ještě něco, teď zhlavy nevím). K tomu lze na Windows využít buď příslušné funkce (CommXXX), nebo poslat danému souboru (ve skutečnosti to je zařízení) příslušné IOCTL (DeviceIoControl).

Je problém zařízení na druhém konci portu, aby mělo parametry nastavené stejně jako ty (resp. je to také tvůj problém. Podle mě se nedá na dálku poznat, s jakými parametry určité zařízení komunikuje, pokud je nenatipuješ).

Nahoru Odpovědět
13.7.2015 19:25
2 + 2 = 5 for extremely large values of 2
Avatar
Bertram
Člen
Avatar
Odpovídá na Martin Dráb
Bertram:13.7.2015 20:31

Děkuji za odpověď, ale moc chytrý z toho nejsem.
Já hledám nějaký návod, jak pomocí jazyka C navázat komunikaci s externím zařízením pomocí komunikační linky RS485 a protokolem MODBUS. Základy jazyka C mám, ale mám je získané spíše na učebnicových příkladech, než na něčem užitečném, jako je zmiňovaná komunikace s externími zařízeními. Tebou popisované funkce budou asi spíše z C++, nebo C# než C. A mě jde momentálně pouze o řešení pomocí jazyka C.

 
Nahoru Odpovědět
13.7.2015 20:31
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Bertram
Martin Dráb:13.7.2015 20:45

Pravda je, že mnou popisované funkce v žádné normě jazyka C nenajdeš. Jesou součástí knihoven Windows API a v prostředí Windows jsou dostupné primárně z C, ale je možné je použít i v C++, C# a dalších jazycích.

Obecně se ale dá říci, že operační systém ti dané rozhraní (pro tebe to RS485) zpřístupňuje jako zařízení (soubor) s určitým názvem. Podle toho, jak s tím zařízením budeš komunikovat, tak se budou posílat data na druhý konec linky (popř. se odtamtud přijímat). Jak příslušné rozhraní nastavit a jak přes něj posílat/příjímat data, buď musíš vědět ty (popř. si to někde přečíst), nebo si najít nějakou knihovnu, která nad daným rozhraním staví abstrakci.

To RS232 (COM) je to tak, že zápisem na daném zařízení (asi by bez větších problémů šlo použít i Cčkové fwrite) se data posílají, při čtení se data přijímají (zase, asi by nebyl problém použít fread) a pak už je nutné jen nastavit parametry přenosu, na což WIndows mají speciální funkce, nebo je můžeš nastavit přímým zasláním požadavku(ů) ovladači zodpovědnému za daný sériový port (odpovídá zaslání požadavku na dané zařízení... ty speciální Windowsí funkce stejně nedělají nic jiného).

Kdybys ale chtěl komunikovattřeba přes TWI (I2C), tak, alespoň podle toho, jak vypadá GUI aplikací, které tuto komunikaci umožňují, je třeba postupovat trochu jinak (bude třeba nastavit, zda-li jsi master či slave, popř. nastavit adresu druhého zařízení atd.).

P.S.
Jelikož je rozhraní (RS232, popř. to tvoje) reprezentováno jako zařízení/soubor, asi nebude problém, pokud trváš na čistém C, k němu získat přístup třeba i přes fopen, ale možná existuje nějaká lepší cesta.

Možná bude nejlepší, když napíšeš, jak bysis tu komunikaci představoval...

Nahoru Odpovědět
13.7.2015 20:45
2 + 2 = 5 for extremely large values of 2
Avatar
Bertram
Člen
Avatar
Bertram:13.7.2015 21:09

Mám převodník USB na RS485 pomocí kterého se připojím k určitému zařízení, například nn vypínači s komunikací po lince RS485 a protokolem Modbus. V manuálu k tomuto vypínači je popis adres, ze kterých lze číst, nebo do nich zapisovat. Pomocí různých nástrojů typu viz obrázek, které reprezentují Modbus master zařízení se pak mohu dotazovat na stav vypínače, nebo pomocí zápisu ho ovlátat atd. To již mám odzkoušené. A já chci docílit toho, abych dokázal to samé, ale bez toho programu, ten chci nahradit vlastním kódem v céčku.

 
Nahoru Odpovědět
13.7.2015 21:09
Avatar
jargry
Člen
Avatar
jargry:15.7.2015 13:10

Převodník USB - RS485 je v počítači reprezentován jako virtuální COM port. Komunikace probíhá jako na standartním COM portu. Nastavení toho portu je na tom tvém obrázku vlevo dole černým písmem. Vlastní komunikaci ti neporadím, je dána popisem protokolu Modbus. Jinak existují prográmky, které umí odposlouchávat komunikaci na Com portu a ukládat do souboru. Tak bys mohl pomocí toho prográmku co máš vyzkoušet všechny příkazy a vysledovat co a jak. Já jsem dělal program na ovládání světel (divadlo) přes RS485 a protokol DMX. Komunikace je ale jen jednosměrná, pouze vysílám. Pokud budeš chtít tak to někde uložím a pošlu Ti odkaz. Je to ale děláno v programovacím jazyku Petr. Jestli jsem pochopil tak se snažíš o inteligentní domácnost nebo něco podobného. Pokud netrváš na C, tak v Petrovi by to to šlo udělat taky.

 
Nahoru Odpovědět
15.7.2015 13:10
Avatar
Bertram
Člen
Avatar
Odpovídá na jargry
Bertram:15.7.2015 22:15

Díky, ale směřuji jinam :)

 
Nahoru Odpovědět
15.7.2015 22:15
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.