serial port v C

Programovacie jazyky, rady, poradňa...
matoH12
Medium Expert
Medium Expert
Príspevky: 127
Registrovaný: 05 mar 2011, 21:13

serial port v C

Príspevok od používateľa matoH12 »

Zdravím
snažím sa urobiť program na načítavanie dat zo serial portu lenže keď použijem

Kód: Vybrať všetko

char b[1];
 n = read(fd, b, 1);
tak mi to uloží ako znaky čiže char ale chcel by som aby sa zo serial portu načítali rovno čísla (mam načítať číslo od 0 po 255). Prípadne ako to konvertovať ?
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: serial port v C

Príspevok od používateľa BX »

Zo sériového portu načítaš vždy blok bytov a byte je v C-čku char. Načítaj si teda pole bytov (charov) a použi to ako "buffer" na ďalšie načítanie. Môžeš potom použiť napríklad funkciu sscanf.
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: serial port v C

Príspevok od používateľa pcsiete »

aby sa zo serial portu načítali rovno čísla (mam načítať číslo od 0 po 255)
Ako čísla? Myslíš cifry alebo binárne hodnoty?
matoH12
Medium Expert
Medium Expert
Príspevky: 127
Registrovaný: 05 mar 2011, 21:13

Re: serial port v C

Príspevok od používateľa matoH12 »

BX: dalo by sa viac rozviest

Myslím rovno čísla(cifry)
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: serial port v C

Príspevok od používateľa BX »

Vieš, čo načítavaš funkciou read? Čo jej dávaš ako paremetre a čo vracia? Aký je popis tej funkcie (v dokumentácií)? Odpovedz si na tieto otázky a potom ešte raz prečítaj moju prvú odpoveď :)

aha, ja stále predpokladám, že chceš načítavať normálne inty. Teraz ma napadlo, že asi nie úplne. Písal si, že chceš načítavať čísla od 0 do 255, takže asi chceš zobrazovať rovno tie bajty.
Takže chyba nebude v načítavaní, ale zobrazovaní. Ako dáta zobrazuješ?
matoH12
Medium Expert
Medium Expert
Príspevky: 127
Registrovaný: 05 mar 2011, 21:13

Re: serial port v C

Príspevok od používateľa matoH12 »

data vypisujem cez

Kód: Vybrať všetko

printf("%s\n", buf);
printf("%d\n", buf);
vysledok potom mam

Kód: Vybrať všetko

P
-1074477824
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: serial port v C

Príspevok od používateľa BX »

Tak teda, ak chceš vypísať naozaj len tie bajty (čísla od 0 do 255), tak to vypíš takto

Kód: Vybrať všetko

for( i = 0; i < n; i++ )
    printf( "%d ", buff[i] );
kde číslo n ti vráti funkcia read (koľko znakov sa načítalo)

Toto je to, čo si chcel?
matoH12
Medium Expert
Medium Expert
Príspevky: 127
Registrovaný: 05 mar 2011, 21:13

Re: serial port v C

Príspevok od používateľa matoH12 »

vložil som to do svojho kódu lenže ono nejak nechce fungovať keď načítam dáta tak vkuse n = 0 čiže ono ani nevypíše nič ale zase písmenko vygeneruje. (v prílohe je program)
Prílohy
c.zip
(940 Bajtov) 46 stiahnutí
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: serial port v C

Príspevok od používateľa pcsiete »

Kód: Vybrať všetko

n = read(fd, buff, 30);
Pokúšaš sa načítať <= 30 bajtov, ale nemusíš ich dostať. Neviem ti presne poradiť, ale ak tam dáta len majú prísť a inde nie je chyba, skús polling (dopytovanie stále alebo každých n milisekúnd).
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: serial port v C

Príspevok od používateľa BX »

Nechce sa mi ísť do linuxu, takže nájdenie presnej chyby nechám na teba. Nuž ale takto:

Keď chceš čítať z nejakého zariadenia, tak snáď máš nejaké základy ohľadom programovania tohoto typu. Takže si alokuješ nejaký buffer - pole charov. Char ale v tomto prípade neber ako znak, ale byte. Rovnako tak pole bajtov nie je reťazec (string), ale pole bajtov.
Funkciou read načítavaš postupnosť bajtov zo zariadenia (z /dev/ttyNiečo v tomto prípade) a je na tebe, ako budeš tieto bajty interpretovať.
Z toho vyplýva, že toto

Kód: Vybrať všetko

printf( "%s", buff );
má zmysel len v prípade, že ti zariadenie pošle (resp. ty prečítaš) platný C-čkovský reťazec (postupnosť bajtov, zmysluplných znakov, zakončená nulovým bajtom)
To vysvetľuje vypisovanie toho "písmenka": Buď funkcia read niečo prečíta a prvý bajt je niečo a druhý bajt je nulový. Alebo funkcia read nič neprečíta a buffer nechá nedotknutý. Vtedy tam máš nejaký bordel (náhodné hodnoty), keďže si ho na začiatku neinicializoval a náhodou sa niečo vypíše.

Tak, ďalšia vec: Ak read vráti nulu, tak čítaš EOF (end-of-file). Znamená to, že už si všetko prečítal a zariadenie ďalej nič neposiela. Vtedy je problém v nesprávnej inicializácií zariadenia (nadviazanie spojenia), alebo je problém na druhej strane - nič neposiela, nereaguje na čítanie atď.

Neviem z čoho chceš čítať dáta, ale toto nie je úplne triviálna vec, takže venuj pozornosť teórií okolo. Snáď ma niekto ešte doplní, ja už dnes umieram...
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: serial port v C

Príspevok od používateľa pcsiete »

BX napísal: Neviem z čoho chceš čítať dáta, ale toto nie je úplne triviálna vec, takže venuj pozornosť teórií okolo. Snáď ma niekto ešte doplní, ja už dnes umieram...
Pridám ešte, že zariadenie ktoré ti posiela bajty môže mať rozdielne usporiadanie bajtov i bitov. Teda
  1. môžeš očakávať napríklad medzeru (0x20, b00100000), a príde ti (0x4, b00000100). To preto, lebo ti boli dáta poslané v inom poradí. Osobne som zatiaľ s niečim takým nemal problém, ale je to možné.
  2. môžeš očakávať napríklad adresu 3GiB (0xc0000000), a príde it 192 (0xc0). Problém spočíva v rozdielnej endianness (teda usporiadaní bajtov). V skutočnosti ti prídu vždy tie isté bajty (0xc0 0x00 0x00 0x00), lenže napríklad ARM procesory začínajú v pamäti s MSB (polopate ten bajt, ktorý vidíš v čísle ako prvý), kým procesory Intel x86 a x86-64 to robia naopak. V špecifickom protokole je poradie bajtov vopred určené (hľadaj ho niekde na začiatku manuálu, patrí to do "Notational Conventions").
Napísať odpoveď