www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Pošiljanje števil po RS-232
Pojdi na stran 1, 2, 3  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Periferija
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
gkrusi
Član
Član



Pridružen-a: Tor 24 Jul 2007 17:22
Prispevkov: 811
Aktiv.: 3.72
Kraj: Ptuj

PrispevekObjavljeno: Ned Sep 16, 2007 2:32 pm    Naslov sporočila:  Pošiljanje števil po RS-232 Odgovori s citatom

Ukvarjam se z RS-232 povezavo, pri kateri sem še kar nov in imam težavo. RS-232 omogoča pošiljanje podatkov po ASCII kodiranju, jaz pa bi moral poslati 3 šestnajst bitne spremenljivke (števila). Ni mi jih problem pretvorit v 6 osem bitnih, a tudi teh ne znam poslati.

Uporabljam PIC18F452, programiran v CCS compilerju (C jezik) in računalniški program napisan v Visual C#.

Ve kdo, kateri so potrebni ukazi za to?
Je to sploh izvedljivo?

Trenutno pa imam namen števila spremenit in poslat tekstovno po števkah (za števila do 99999, je to 5 števk), vendar je potem že to pretvarjanje večji del programa Evil or Very Mad .

V naprej hvala za odgovore!

_________________
Zakaj bi bilo preprosto, če je lahko zakomplicirano???
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.57

PrispevekObjavljeno: Ned Sep 16, 2007 3:20 pm    Naslov sporočila:   Odgovori s citatom

Kaj ? :?

Ce imas 16-bitno stevilko, potem posljes najprej en, nato pa se drugi bajt. Vrstni red ni bistven, da le na drugi strani prav sestavis vse skupaj (torej vsaj bajt na njegovo mesto). Ce funkcija poslji(c: char) odposlje en bajt, potem 16-bitno vrednost w posljes z

poslji((w >> 8-) & 0xff);
poslji((w >> 0) & 0xff);

Na drugi strani najprej sprejmes en bajt (c1), nato pa se drugega (c2) inju sestavis nazaj z

w = (c1 << 8-) | c2;

Opomba: prevaljanik bo med optimizacijo odstranil odvecni del (shift za 0 in maskirabnje 8-bitne vrednosti), tam je napisano zato, da je jasno kako stvar deluje.

_________________
Ka ti bo pa torba ce si kupu kolo ?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
NeoTO
Član
Član



Pridružen-a: Pon 28 Mar 2005 19:19
Prispevkov: 2752
Aktiv.: 11.62
Kraj: Trzic

PrispevekObjavljeno: Ned Sep 16, 2007 4:49 pm    Naslov sporočila:   Odgovori s citatom

Tole daš na začetek kode nekam:

Koda:
#use rs232(baud=19200, xmit=PIN_C0, parity=N)


Izhod C0 je v tem primeru oddajni pin za RS-232.
Za pošiljanje podatkov pa potem uporabiš ukaze Putc(x); Printf("[slovenščina je zame španska vas] %u", x); ki so del CCS C compilerja.

Glede C# pa je tako:

Inicializacija:

Koda:
            // Create a new SerialPort object with default settings.
            sPort = new SerialPort();

            // Allow the user to set the appropriate properties.
            sPort.PortName ="COM1";

            sPort.BaudRate = 19200;
            sPort.Parity = Parity.None;
            sPort.DataBits = 8;
            sPort.StopBits = StopBits.One;
            sPort.Handshake = Handshake.None;

            // Set the read/write timeouts
            sPort.ReadTimeout = 500;
            sPort.WriteTimeout = 500;

            Console.WriteLine("Opening port...");
           
            sPort.Open();

            // Tukaj bereš podatke ....

            sPort.Close();



Ko pa so podatki na razpolago, pa jih prebereš z ukazom:
Koda:
                       
 sPort.Read(buffer, buffer_start, size);


Da pa ugotoviš, če so podatki na razpolago, pa preveriš tole lastnost:
Koda:
sPort.BytesToRead

_________________
Lp,
Matevž
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
icek
Član
Član



Pridružen-a: Ned 15 Maj 2005 22:31
Prispevkov: 105
Aktiv.: 0.44
Kraj: Ruše

PrispevekObjavljeno: Ned Sep 16, 2007 8:42 pm    Naslov sporočila:   Odgovori s citatom

Samo pazi pri C#. Jaz sem imel kar probleme s serijskim portom v .net framworku 2.0. Če sem pošiljal dosti podatkov zaporedoma, enostavno nisem dobil vseh. Ne vem v čem je bil problem.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
NeoTO
Član
Član



Pridružen-a: Pon 28 Mar 2005 19:19
Prispevkov: 2752
Aktiv.: 11.62
Kraj: Trzic

PrispevekObjavljeno: Ned Sep 16, 2007 9:01 pm    Naslov sporočila:   Odgovori s citatom

Buffer za serijski port je omejen in če si prehiter se lahko zgodi, da prepišeš podatke, ki še sploh niso bili poslani...
_________________
Lp,
Matevž
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
icek
Član
Član



Pridružen-a: Ned 15 Maj 2005 22:31
Prispevkov: 105
Aktiv.: 0.44
Kraj: Ruše

PrispevekObjavljeno: Pon Sep 17, 2007 7:03 am    Naslov sporočila:   Odgovori s citatom

Verjetno je res problem z bufferjerm. Čeprav se mi zdi (nisem popolnoma prepričan), da ga je bilo 8k. Jaz pa sem pošiljal 1k podatkov. Tudi na netu sem bral, da so mnogi imeli probleme. PRoblem sem rešil, da sem vzel eno drugo (plačljivo) RS232 kontrolo, ki je lepo delala.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
jur
Član
Član



Pridružen-a: Pet 02 Dec 2005 14:45
Prispevkov: 5142
Aktiv.: 21.71
Kraj: [color=zelena]Ljubljana[/color]

PrispevekObjavljeno: Pon Sep 17, 2007 10:50 am    Naslov sporočila:   Odgovori s citatom

Buffer za serijsko komunikacijo je po dolžini res omejen. Vendar pa za izgubo podatkov pri branju in pisanju iz/na COM port ni kriv popolnoma nič.

Če se pošilja večjo količino podatkov je potrebno uporabiti flow control (nadzor pretoka). To se dela na dva načina:

- Softwersko, oziroma Xoff/Xon. To deluje tako, da ko se začne buffer nevarno polniti, naprava pošlje na drugo stran (pošiljatelju) kodo Xoff (običajno je to CTRL-S). Ob prejemu te kode pošiljatelj utihne, dokler sprejemnik ne prežveči podatkov (sprazni buffer) in pošlje Xon (običajno CTRL-Q) za nadaljevanje pošiljanja.
Za ta način komunikacije so potrevne tri žice: RX, TX in masa.

- Hardwerski flow control ima dve verziji: RTS/CTS in DSR/DTR.
Pini z temi imeni se nahajajo na RS232 priključnem konektorju. Pri tem načinu pošiljalec spremeni logični nivo na ustrezni žici. Je hitrejše in učinkoviteje od softwerske kontrole. V kablu je potrebno vsaj 5 žic.

Z pravilnim izborom flow kontrole in z pravilnim programiranjem se prepreči kakršnakoli izguba podatkov. Res pa je programiranje prenosa podatkov brez flowa bistveno enostavneje. Zato pa ne deluje vedno in zanesljivo.

Quote: "PRoblem sem rešil, da sem vzel eno drugo (plačljivo) RS232 kontrolo, ki je lepo delala."
Kontrola uporablja flow control....

Jur
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Proteus
Član
Član



Pridružen-a: Sre 15 Jun 2005 10:03
Prispevkov: 1943
Aktiv.: 8.20

PrispevekObjavljeno: Pon Sep 17, 2007 11:21 am    Naslov sporočila:  Re: Pošiljanje števil po RS-232 Odgovori s citatom

gkrusi je napisal/a:
RS-232 omogoča pošiljanje podatkov po ASCII kodiranju

????
Po RS-232 lahko pošiljaš kar hočeš, omejitev je kvečjemu hitrost in zastarelost vmesnika (novejši računalniki ga enostavno nimajo več).
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
jur
Član
Član



Pridružen-a: Pet 02 Dec 2005 14:45
Prispevkov: 5142
Aktiv.: 21.71
Kraj: [color=zelena]Ljubljana[/color]

PrispevekObjavljeno: Pon Sep 17, 2007 11:32 am    Naslov sporočila:   Odgovori s citatom

Kodiranje: Ascii gor ali dol. Serijski port naenkrat pošlje 8 (7 bitov se skoraj ne uporablja) bitov. Vrednosti so od 0 do 255.

Jur
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Proteus
Član
Član



Pridružen-a: Sre 15 Jun 2005 10:03
Prispevkov: 1943
Aktiv.: 8.20

PrispevekObjavljeno: Pon Sep 17, 2007 11:36 am    Naslov sporočila:   Odgovori s citatom

jur je napisal/a:
Serijski port naenkrat pošlje 8 (7 bitov se skoraj ne uporablja) bitov.

Lahko ga uporabiš tudi drugače (od tistega kar predvidevaš) in ti bo pošiljal zaporedje ŽNJ bitov.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
jur
Član
Član



Pridružen-a: Pet 02 Dec 2005 14:45
Prispevkov: 5142
Aktiv.: 21.71
Kraj: [color=zelena]Ljubljana[/color]

PrispevekObjavljeno: Pon Sep 17, 2007 2:12 pm    Naslov sporočila:   Odgovori s citatom

Serijski port pošiljaza en posamezen znak:
- 1 start bit,
- 7 ali 8 podatkovnih bitov
- 1 ali 2 stop bita.

Pri večini UARTov (hardware za com port) se kaj drugega ne da pošiljat.

Hitrost pošiljanje je znak za znakom, ko je odposlan stop bit enega znaka, lahko brez zakasnitve sliedi start bit naslednjega znaka. Start/stop bit sta v bistvu ločili med znaki. Znake se lahko pošilja brez prekinitev v nedogled. Vprašanje pa je, če bo sprejemnik to lahko požrl.

Ali je znak ASCI ali je kaj drugega, je stvar dogovora oziroma kodne tabele,
kakšno bo ime tega znaka. ASCII, ISO Latin1, ISO Latin2, in tako naprej so imena za znake (sete znakov).

Jur
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Proteus
Član
Član



Pridružen-a: Sre 15 Jun 2005 10:03
Prispevkov: 1943
Aktiv.: 8.20

PrispevekObjavljeno: Pon Sep 17, 2007 2:32 pm    Naslov sporočila:   Odgovori s citatom

jur je napisal/a:
Serijski port pošiljaza en posamezen znak:
- 1 start bit,
- 7 ali 8 podatkovnih bitov
- 1 ali 2 stop bita.

Jur, serijski port ima poleg Rx in Tx še kaj poleg.

Sam za izvedbo nestandardnih serijskih prenosov uporabljam:
RTS in DTR (izhoda),
DSR in CTS (vhoda),
ki jih lahko s pomočjo programske opreme poljubno krmiliš.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
icek
Član
Član



Pridružen-a: Ned 15 Maj 2005 22:31
Prispevkov: 105
Aktiv.: 0.44
Kraj: Ruše

PrispevekObjavljeno: Pon Sep 17, 2007 9:25 pm    Naslov sporočila:   Odgovori s citatom

jur je napisal/a:
Buffer za serijsko komunikacijo je po dolžini res omejen. Vendar pa za izgubo podatkov pri branju in pisanju iz/na COM port ni kriv popolnoma nič.

Če se pošilja večjo količino podatkov je potrebno uporabiti flow control (nadzor pretoka). To se dela na dva načina:

- Softwersko, oziroma Xoff/Xon. To deluje tako, da ko se začne buffer nevarno polniti, naprava pošlje na drugo stran (pošiljatelju) kodo Xoff (običajno je to CTRL-S). Ob prejemu te kode pošiljatelj utihne, dokler sprejemnik ne prežveči podatkov (sprazni buffer) in pošlje Xon (običajno CTRL-Q) za nadaljevanje pošiljanja.
Za ta način komunikacije so potrevne tri žice: RX, TX in masa.

- Hardwerski flow control ima dve verziji: RTS/CTS in DSR/DTR.
Pini z temi imeni se nahajajo na RS232 priključnem konektorju. Pri tem načinu pošiljalec spremeni logični nivo na ustrezni žici. Je hitrejše in učinkoviteje od softwerske kontrole. V kablu je potrebno vsaj 5 žic.

Z pravilnim izborom flow kontrole in z pravilnim programiranjem se prepreči kakršnakoli izguba podatkov. Res pa je programiranje prenosa podatkov brez flowa bistveno enostavneje. Zato pa ne deluje vedno in zanesljivo.

Quote: "PRoblem sem rešil, da sem vzel eno drugo (plačljivo) RS232 kontrolo, ki je lepo delala."
Kontrola uporablja flow control....

Jur


Poznam flow control-e. Še vedno mislim, da je bil bug v RS232 kontroli za .net 2.0. Tudi na forumih sem bral podobne probleme. Pri uporabljeni RS232 kontroli ni bilo uporabljenega flow kontrola iz strani uC.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Djurodrljaca
Član
Član



Pridružen-a: Pet 19 Dec 2003 16:31
Prispevkov: 393
Aktiv.: 1.66
Kraj: Mengeš

PrispevekObjavljeno: Pon Sep 17, 2007 11:27 pm    Naslov sporočila:   Odgovori s citatom

Priporočam ti, da pošiljaš podatke v manjših kosih (glede na velikost serialPort.WriteBufferSize) in po vsakem poslanem kosu preveri, če je že poslal vse podatke (poglej si serialPort.BytesToWrite). to lahko narediš na ta način:
Koda:
serialPort.Write(data);
while (serialPort.BytesToWrite > 0)
{
    Thread.Sleep(1);
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
icek
Član
Član



Pridružen-a: Ned 15 Maj 2005 22:31
Prispevkov: 105
Aktiv.: 0.44
Kraj: Ruše

PrispevekObjavljeno: Tor Sep 18, 2007 7:03 am    Naslov sporočila:   Odgovori s citatom

S tem problemom sem se ukvarjal kakšni 2 leti nazaj. Tako, da me ne skrbi več. Neumno pa si mi zdi zaradi takih pomankljivosti program ustavljat (Thread.Sleep()),
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Periferija Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2, 3  Naslednja
Stran 1 od 3

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 492 dni


Powered by phpBB © 2001, 2005 phpBB Group