Jak pracovat s COM přes USB v C/C++

ubuntak

Jak pracovat s COM přes USB v C/C++
« kdy: 22. 03. 2010, 09:10:03 »
Preji hezky den, nevite nekdo jak pracovat s COM prez USB? Na starem PC byl COM port, ktery se pouzival. PC zdechlo. Ted mam nove kde sem dal redukci z USB na COM a ted potrebuju upravit zdrojak v Cecku aby delal to co ja potrebuju. Jenze jakou adresu mam predat do outb kdyz nevim jakou ma. Googlil sem ale nic.
« Poslední změna: 22. 03. 2010, 11:56:18 od Petr Krčmář »


Re: Jak pracova s COM prez USB v C/C++
« Odpověď #1 kdy: 22. 03. 2010, 10:58:40 »
S Redukcí USB2Serial nemůžete pracovat přímým zápisem na nějakou I/O adresu (a ostatně, pokud nemáte nějaké hodně speciální nestandardní požadavky*, neměl byste to dělat ani u klasického sériového portu). Cesta vede přes speciální soubor /dev/ttyUSB0 skupinu volání open(), close(), read(), write(), a ioctl(). Každé má manuálovou stánku v sekci 2 manuálu. Dále doporučuji manuálové stránky tty_ioctl a podobné.

Popřípadě můžu doporučit například předmět Připojování periferií k osobním počítačům.

*) Pokud máte nějaké nestandardní požadavky, či využíváte speciálních vlastnosti 8251/16550, pak to stejně přes USB převodníky nebude fungovat :)

ubuntak

Re: Jak pracova s COM prez USB v C/C++
« Odpověď #2 kdy: 22. 03. 2010, 11:23:25 »
dekuji za reakci. Zrejme teda bude problem v tom nahodit na jednom pinu logickou jednicku? Jestli ma teda pro me smysl zacit procitat ty materialy.  Na starem PC se provadelo snimani teploty z DS18B20 pomoci programu digitemp. A kdyz byla teplota vysoko sepnul se vetrak a chladil. Ten se spinal prez rele spinane prez jeden pin com portu. Ted toto reseni potrebuju napasovat na USB jelikoz novej board nema com port.

jv

Re: Jak pracovat s COM přes USB v C/C++
« Odpověď #3 kdy: 22. 03. 2010, 12:26:39 »
Pekny den.

Tu sa pletie viacero veci.
DS18x20 je teplotne cidlo, ktore komunikuje po 1-Wire Bus (cize zbernici). Na to, aby ste mohli udaje z tohoto cisla prenasat do pocitaca, potrebujete HW, ktory ma fyzicku vrstvu prisposobenu pre 1-Wire komunikaciu. RS232 (u nas zname ako 'seriovy port') nie je kompatibilna s fyzickou vrstvou 1-Wire Bus.
Ak hovorime o paralelnom pristupe cez ECP, co je standard pre Centronics (u nas znamy pod menom 'paralelny port'), s jednoduchsim HW- prisposobovacim clenom- by sa uz dalo uvazovat o naslednom prepojeni:
DS18B20 - SingleWire - ECP - USB - PC... Vsimnite si, ze RS232 som nikde nepouzil. Zda sa mi to vsak zlozite a jednoduchsie je spravit si prevodnik SingleWire - RS232 pomocou nejakeho mikrokontroleru.

Skuste teda este raz specifikovat poziadavky a problem...

jv

Re: Jak pracovat s COM přes USB v C/C++
« Odpověď #4 kdy: 22. 03. 2010, 12:36:45 »
Skusim este doplnit:
ako bolo spomenute, standard RS-232 specifikuje okrem datovych aj riadiace vodice, ktorymi sa riadi komunikacia a ktore sa daju ovladat zvlast. Mozno sa myslel tento signal na ovladanie externeho zariadenia?


Re: Jak pracova s COM prez USB v C/C++
« Odpověď #5 kdy: 22. 03. 2010, 13:54:36 »
dekuji za reakci. Zrejme teda bude problem v tom nahodit na jednom pinu logickou jednicku? Jestli ma teda pro me smysl zacit procitat ty materialy.  Na starem PC se provadelo snimani teploty z DS18B20 pomoci programu digitemp. A kdyz byla teplota vysoko sepnul se vetrak a chladil. Ten se spinal prez rele spinane prez jeden pin com portu. Ted toto reseni potrebuju napasovat na USB jelikoz novej board nema com port.
Pokud jde o nahazování/shazování jednoho bitu, dá se použít ioctl TIOCMSET (viz man tty_ioctl). Nebo, pokud je to převodník od FTDI, dá se použít tzv. bit-bang mód.

ubuntak

Re: Jak pracovat s COM přes USB v C/C++
« Odpověď #6 kdy: 22. 03. 2010, 15:17:00 »
Pekny den.

Tu sa pletie viacero veci.
DS18x20 je teplotne cidlo, ktore komunikuje po 1-Wire Bus (cize zbernici). Na to, aby ste mohli udaje z tohoto cisla prenasat do pocitaca, potrebujete HW, ktory ma fyzicku vrstvu prisposobenu pre 1-Wire komunikaciu. RS232 (u nas zname ako 'seriovy port') nie je kompatibilna s fyzickou vrstvou 1-Wire Bus.
Ak hovorime o paralelnom pristupe cez ECP, co je standard pre Centronics (u nas znamy pod menom 'paralelny port'), s jednoduchsim HW- prisposobovacim clenom- by sa uz dalo uvazovat o naslednom prepojeni:
DS18B20 - SingleWire - ECP - USB - PC... Vsimnite si, ze RS232 som nikde nepouzil. Zda sa mi to vsak zlozite a jednoduchsie je spravit si prevodnik SingleWire - RS232 pomocou nejakeho mikrokontroleru.

Skuste teda este raz specifikovat poziadavky a problem...
sme se nejak nepochopili cidlo jede jak ma meri vse vporadku.Program DigiTemp dela vse bez problemu. Co ja potrebuju je ze na ten samy kabel povesim to rele. protoze na teplomer nejsou vyuzity vsechny vystupni piny COM portu. Kdysi jsem mel vytvoreny vlstni program v cecku ktery cetl z cidla teplotu nez jsem nasel digitemp. A nepotreboval sem k tomu zadny prevodnik. Stacilo par diod a odpor a vse jelo jak hodinky.

ubuntak

Re: Jak pracova s COM prez USB v C/C++
« Odpověď #7 kdy: 22. 03. 2010, 15:19:19 »
dekuji za reakci. Zrejme teda bude problem v tom nahodit na jednom pinu logickou jednicku? Jestli ma teda pro me smysl zacit procitat ty materialy.  Na starem PC se provadelo snimani teploty z DS18B20 pomoci programu digitemp. A kdyz byla teplota vysoko sepnul se vetrak a chladil. Ten se spinal prez rele spinane prez jeden pin com portu. Ted toto reseni potrebuju napasovat na USB jelikoz novej board nema com port.
Pokud jde o nahazování/shazování jednoho bitu, dá se použít ioctl TIOCMSET (viz man tty_ioctl). Nebo, pokud je to převodník od FTDI, dá se použít tzv. bit-bang mód.

tak toto vypada na to prave orechove. diky otestuju.

jv

Re: Jak pracovat s COM přes USB v C/C++
« Odpověď #8 kdy: 23. 03. 2010, 12:12:17 »
Kdysi jsem mel vytvoreny vlstni program v cecku ktery cetl z cidla teplotu nez jsem nasel digitemp. A nepotreboval sem k tomu zadny prevodnik. Stacilo par diod a odpor a vse jelo jak hodinky.
No tie diody a odpory spravili ten prisposobovaci clen, ze ano... :)

tak toto vypada na to prave orechove. diky otestuju.
No tu je problem: ak uz nejaky proces zariadenie otvoril, vas proces k zariadeniu nemoze pristupovat, ani pomocou ioctl, nakolko predtym treba zariadenie otvorit.

ubuntak

Re: Jak pracovat s COM přes USB v C/C++
« Odpověď #9 kdy: 24. 03. 2010, 10:58:03 »
Az po provedeni mereni se provede sepnuti ci rozepnuti rele. takze se nesejdou dva procesy ktere by se cpaly na port.
problem je ze  nejsem stejne schopnej nahodit jen RTS. Jak to zkousim tak to proste nejde. Prikladam kod kde se snazim nahodit RTS a pak zjistit jeho stav. Nevite nekdo jak provest nahozeni je RTS? Zkousel jsem i zapis pomoci write ale taky to nejde.

Kód: [Vybrat]
unsigned int changeStatusRele (unsigned int status)                                       
{                                                                                         
  int   usbSerial,                                                                       
        serial;                                                                           
                                                                                         
  usbSerial=open("/dev/ttyUSB0", O_RDWR);                                                 
  printf ("otevren serial\n");                                                           
  if ((ioctl (usbSerial, TIOCMSET))!=0) {                                               
    puts ("chyba pri ioctl");                                                             
  }
  getchar();
  puts("Provedeno ioctl");                                                               
  getchar();                                                                             

  if ((ioctl (usbSerial, TIOCMGET, &serial))!=0) {                                       
    puts ("chyba pri ioctl");                                                             
  }                                                                                       
                                                                                         
  if (serial & TIOCM_RTS) {                                                               
    printf ("Nahozeno RTS\n");                                                           
  }                                                                                       
  else {                                                                                 
    printf ("Zhozeno RTS\n");                                                             
  }                                                                                       
  getchar();                                                                             
  close (usbSerial);                                                                     
  puts ("Uzavren port");                                                                 
  getchar();                                                                             
  return TRUE;                                                                           
}

JH

Proč máš desku bez COM portu?
« Odpověď #10 kdy: 24. 03. 2010, 11:09:10 »
proc si porizujes desku bez com kdyz com potrebujes?
« Poslední změna: 24. 03. 2010, 12:44:54 od Petr Krčmář »

ubuntak

Re: Jak pracovat s COM přes USB v C/C++
« Odpověď #11 kdy: 24. 03. 2010, 11:16:04 »
Poridil sem http://www.czechcomputer.cz/product.jsp?artno=70355 a ma slouzit pro vic nez jen toto. A bohuzel jsem nenasel desku mini ITX, ktera by mela COM port. Jestli nejakou znate sem sni. Stale muzu jeste tuto vratit.

ubuntak

Re: Jak pracovat s COM přes USB v C/C++
« Odpověď #12 kdy: 24. 03. 2010, 11:27:01 »
lidicky pomoc mam 4 oci a az ted jsem si vsiml ze na desce je konektor na com port.  :o
Ale stejne by me zajimalo jak to realizovat prez to usb

jv

Re: Jak pracovat s COM přes USB v C/C++
« Odpověď #13 kdy: 24. 03. 2010, 23:50:58 »
Skus toto:
   
Kód: [Vybrat]
int status;
ioctl(fd, TIOCMGET, &status);
status &= ~TIOCM_DTR;
ioctl(fd, TIOCMSET, &status);
Az po provedeni mereni se provede sepnuti ci rozepnuti rele. takze se nesejdou dva procesy ktere by se cpaly na port.
problem je ze  nejsem stejne schopnej nahodit jen RTS. Jak to zkousim tak to proste nejde. Prikladam kod kde se snazim nahodit RTS a pak zjistit jeho stav. Nevite nekdo jak provest nahozeni je RTS? Zkousel jsem i zapis pomoci write ale taky to nejde.

Kód: [Vybrat]
unsigned int changeStatusRele (unsigned int status)                                       
{                                                                                         
  int   usbSerial,                                                                       
        serial;                                                                           
                                                                                         
  usbSerial=open("/dev/ttyUSB0", O_RDWR);                                                 
  printf ("otevren serial\n");                                                           
  if ((ioctl (usbSerial, TIOCMSET))!=0) {                                               
    puts ("chyba pri ioctl");                                                             
  }
  getchar();
  puts("Provedeno ioctl");                                                               
  getchar();                                                                             

  if ((ioctl (usbSerial, TIOCMGET, &serial))!=0) {                                       
    puts ("chyba pri ioctl");                                                             
  }                                                                                       
                                                                                         
  if (serial & TIOCM_RTS) {                                                               
    printf ("Nahozeno RTS\n");                                                           
  }                                                                                       
  else {                                                                                 
    printf ("Zhozeno RTS\n");                                                             
  }                                                                                       
  getchar();                                                                             
  close (usbSerial);                                                                     
  puts ("Uzavren port");                                                                 
  getchar();                                                                             
  return TRUE;                                                                           
}