 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
gkrusi Član



Pridružen-a: Tor 24 Jul 2007 17:22 Prispevkov: 811 Aktiv.: 3.72 Kraj: Ptuj
|
Objavljeno: Ned Sep 16, 2007 2:32 pm Naslov sporočila: Pošiljanje števil po RS-232 |
|
|
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 .
V naprej hvala za odgovore! _________________ Zakaj bi bilo preprosto, če je lahko zakomplicirano??? |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Ned Sep 16, 2007 3:20 pm Naslov sporočila: |
|
|
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 |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.62 Kraj: Trzic
|
Objavljeno: Ned Sep 16, 2007 4:49 pm Naslov sporočila: |
|
|
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:
_________________ Lp,
Matevž |
|
Nazaj na vrh |
|
 |
icek Član

Pridružen-a: Ned 15 Maj 2005 22:31 Prispevkov: 105 Aktiv.: 0.44 Kraj: Ruše
|
Objavljeno: Ned Sep 16, 2007 8:42 pm Naslov sporočila: |
|
|
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 |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.62 Kraj: Trzic
|
Objavljeno: Ned Sep 16, 2007 9:01 pm Naslov sporočila: |
|
|
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 |
|
 |
icek Član

Pridružen-a: Ned 15 Maj 2005 22:31 Prispevkov: 105 Aktiv.: 0.44 Kraj: Ruše
|
Objavljeno: Pon Sep 17, 2007 7:03 am Naslov sporočila: |
|
|
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 |
|
 |
jur Član


Pridružen-a: Pet 02 Dec 2005 14:45 Prispevkov: 5142 Aktiv.: 21.71 Kraj: [color=zelena]Ljubljana[/color]
|
Objavljeno: Pon Sep 17, 2007 10:50 am Naslov sporočila: |
|
|
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 |
|
 |
Proteus Član



Pridružen-a: Sre 15 Jun 2005 10:03 Prispevkov: 1943 Aktiv.: 8.20
|
Objavljeno: Pon Sep 17, 2007 11:21 am Naslov sporočila: Re: Pošiljanje števil po RS-232 |
|
|
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 |
|
 |
jur Član


Pridružen-a: Pet 02 Dec 2005 14:45 Prispevkov: 5142 Aktiv.: 21.71 Kraj: [color=zelena]Ljubljana[/color]
|
Objavljeno: Pon Sep 17, 2007 11:32 am Naslov sporočila: |
|
|
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 |
|
 |
Proteus Član



Pridružen-a: Sre 15 Jun 2005 10:03 Prispevkov: 1943 Aktiv.: 8.20
|
Objavljeno: Pon Sep 17, 2007 11:36 am Naslov sporočila: |
|
|
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 |
|
 |
jur Član


Pridružen-a: Pet 02 Dec 2005 14:45 Prispevkov: 5142 Aktiv.: 21.71 Kraj: [color=zelena]Ljubljana[/color]
|
Objavljeno: Pon Sep 17, 2007 2:12 pm Naslov sporočila: |
|
|
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 |
|
 |
Proteus Član



Pridružen-a: Sre 15 Jun 2005 10:03 Prispevkov: 1943 Aktiv.: 8.20
|
Objavljeno: Pon Sep 17, 2007 2:32 pm Naslov sporočila: |
|
|
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 |
|
 |
icek Član

Pridružen-a: Ned 15 Maj 2005 22:31 Prispevkov: 105 Aktiv.: 0.44 Kraj: Ruše
|
Objavljeno: Pon Sep 17, 2007 9:25 pm Naslov sporočila: |
|
|
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 |
|
 |
Djurodrljaca Član

Pridružen-a: Pet 19 Dec 2003 16:31 Prispevkov: 393 Aktiv.: 1.66 Kraj: Mengeš
|
Objavljeno: Pon Sep 17, 2007 11:27 pm Naslov sporočila: |
|
|
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 |
|
 |
icek Član

Pridružen-a: Ned 15 Maj 2005 22:31 Prispevkov: 105 Aktiv.: 0.44 Kraj: Ruše
|
Objavljeno: Tor Sep 18, 2007 7:03 am Naslov sporočila: |
|
|
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 |
|
 |
|
|
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
|