Kazalo po Svet elektronike forumu Svet elektronike
Revija za prave elektronike
 
AlbumAlbum   Pomoč pogostih vprašanjPomoč pogostih vprašanj   IščiIšči   Seznam članovSeznam članov   Skupine uporabnikovSkupine uporabnikov   Registriraj seRegistriraj se 
 Tvoj profilTvoj profil   Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil   PrijavaPrijava 

RS232 komunikacija

 
Objavi novo temo   Odgovori na to temo    Kazalo po Svet elektronike forumu -> Digitalna elektronika
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
besoft
Profesionalec


Pridružen/-a: Čet Maj 2010 10:26
Prispevkov: 98

PrispevekObjavljeno: Pon Maj 31, 2010 9:33 am    Naslov sporočila: RS232 komunikacija Odgovori s citatom

Naletel sem na eno težavo in sicer:

Po rs232 pošljem napravi en ukaz. Naprava mi vrne ukaz in v naslednji vrstici zahtevan podatek. Naprva tako deluje, zato tega nemorem spremeniti. Rabim pa samo podatek iz druge vrstice in sicer samo del podatka. Kako do dela podatka vem, uporabljam Mid funkcijo. Nevem le kako prebrati drugo vrstico. Prvo preberem iz buferja, do druge pa nemorem. Kako bi laho ti dve vrstici združil v eno in jo shranil kot string spremenljivko. Težava pa je še v tem, da druga vrstica ni vedno enako dolga.

poslani ukaz: ?98.1

vrnjen podatek:
?98.1
Ix.1=100

zanima me tista "100" ka v drugi vrstici.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
RudiP
Profesionalec


Pridružen/-a: Sre Jul 2008 8:39
Prispevkov: 128
Kraj: KOPER

PrispevekObjavljeno: Pon Maj 31, 2010 4:29 pm    Naslov sporočila: Odgovori s citatom

Ali poznaš format - sestavo podatkov katerega ti vrača naprava ?

Vprašanje ali ti naprava vrača en string ali dva ?. Sam bi naredil tako, da bi napravil hex izpis sprejetega stringa ter se potem odločil kje brati podatek. Pripni ustrezni del kode, pa ti bomo lahko pomagali.

_________________
Lep pozdrav !
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Vlado
Profesionalec


Pridružen/-a: Ned Jan 2004 16:11
Prispevkov: 556
Kraj: Ljubljana

PrispevekObjavljeno: Tor Jun 01, 2010 8:08 am    Naslov sporočila: Odgovori s citatom

Lahko narediš na dva načina,
lahko čakaš dva podatka in prvega ignoriraš če je enak poslanemu, ali pa uporabiš ukaz

Citiram:
Input S Noecho


LP
Vlado
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
besoft
Profesionalec


Pridružen/-a: Čet Maj 2010 10:26
Prispevkov: 98

PrispevekObjavljeno: Tor Jun 01, 2010 11:10 am    Naslov sporočila: Odgovori s citatom

RudiP je napisal/a:
Ali poznaš format - sestavo podatkov katerega ti vrača naprava ?

Vprašanje ali ti naprava vrača en string ali dva ?. Sam bi naredil tako, da bi napravil hex izpis sprejetega stringa ter se potem odločil kje brati podatek. Pripni ustrezni del kode, pa ti bomo lahko pomagali.



vrnjen podatek:
?98.1
Ix.1=100

Zgoraj napisani vrnjeni podatek je dejansko realen. Sta dva stringa, ker sta vrstici ločeni.

Neke kode še nimam, ker so vsi poskusi spodleteli in nevenm natančno kako se tega lotiti...
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
ivan
Mojster


Pridružen/-a: Pon Mar 2004 18:49
Prispevkov: 45
Kraj: Cerkno

PrispevekObjavljeno: Tor Jun 01, 2010 1:25 pm    Naslov sporočila: Odgovori s citatom

priprava ti vrjetno vrne več strigov ločenih z enter + nova vrsta.
Jaz sem v takih primerih uporabil ukaz INPUT z več spremenljivkami.
Na koncu mora biti Noecho.


primer branja 5 stringov

Input St1 , St2 , St3 , St4 , St5 Noecho

Print St1; St2 ,St3 ,St4 ,St5


Nazadnje urejal/a ivan Sre Jun 02, 2010 11:57 am; skupaj popravljeno 1 krat
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Vlado
Profesionalec


Pridružen/-a: Ned Jan 2004 16:11
Prispevkov: 556
Kraj: Ljubljana

PrispevekObjavljeno: Tor Jun 01, 2010 4:17 pm    Naslov sporočila: Odgovori s citatom

Poskusi tako kot ti je predlagal Ivan.
Če boš uporabljal terminal program potem predlagam da boš pozoren na <CR><LF>, ker ti bo za drugi string vrnilo samo to (prazno vrstico). Tretji string je tisti ki ga ti potrebuješ za obdelavo.
Uporabi terminal ki ima zraven izpis tudi v HEX ali DEC obliki (Bray) in boš lažje prišel do podatka ki te zanima.

Da bi iz podatka izluščil samo številko ali del stringa za znakom "=" poglej ukaze "Instr", "Left", Right in Len.

Najprej preberi dolžino vrnjenega stringa (Len)
Poišči na katerem mestu stringa se nahaja "="; x=Instr(sprejet string,"=").
od dolžine stringa odštej mesto znaka "="
Potem z ukazom Right izlušči del stringa za znakom"=".

Vlado
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
besoft
Profesionalec


Pridružen/-a: Čet Maj 2010 10:26
Prispevkov: 98

PrispevekObjavljeno: Sre Jun 02, 2010 11:23 am    Naslov sporočila: Odgovori s citatom

..težava je v tem, da sploh ne dobim stringa nazaj..nekaj sicer dobim ampak se zadeva zelo spreminja...

kodo imam pa takole:
Koda:

On Urxc Rec_isr                                             'define serial receive ISR
Enable Urxc 

Enable Interrupts

Dim B As Bit                                                'a flag for signalling a received character
Dim Bc As Byte
Dim D As Byte
Const Cmaxchar = 9

Do
Print "?98.1"
Debounce Pind.3 , 0 , Zagon , Sub Glavna
Debounce Pind.2 , 0 , Ustavi , Sub Glavna
'Cls
 If B = 1 Then                                              'we received something
     Disable Serial
     Lcdat 2 , 1 , "{" ; S1 ; "}"                           'print buffer
     Lcdat 3 , 1 , "BC:" ; Bc                               'print character counter
     'now check for buffer full
     If Bc = Cmaxchar Then                                  'buffer full
        S1 = ""                                             'clear
        Bc = 0                                              'rest character counter
     End If
Reset B                                                     'reset receive flag
     Enable Serial
  End If
  Wait 1
Loop
Return

Return

Rec_isr:
  D = Udr                                                   'read UDR only once
 'Lcdat 4 , 1 , D                                            ' show that we got here
  If Bc < Cmaxchar Then                                     'does it fit into the buffer?
     Incr Bc                                                'increase buffer counter
    '
    If D = 13 Then                                          'return?
    S1 = S1 + Chr(0)                                        '
    Bc = Cmaxchar                                           'at the end
   Else
        S1 = S1 + Chr(d)                                    'add to buffer
    End If
      End If
  B = 1                                                     'set flag
Return
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Vlado
Profesionalec


Pridružen/-a: Ned Jan 2004 16:11
Prispevkov: 556
Kraj: Ljubljana

PrispevekObjavljeno: Sre Jun 02, 2010 2:01 pm    Naslov sporočila: Odgovori s citatom

Zakaj po sprejemu prvega stringa izklopiš interrupt?
LCD ukazi vzameju kar "veliko" procesorskega časa in zamudš naslednji string ker si izklopil prekinitev!
Če ti naprava odgovarja samo na vprašanja potem pred ukazom print dodaj še tri stringe katere boš tu postavil na "", po sprejemu prvega daj sprejeti string v prvi string, povečaj nek kazalec da naslednji sprejeti string prestavi v string2, enako za tretji sprejeti string, potem jih lahko obdeluješ po mili volji ne da bi kaj zamudil.
Za tako enostavno zadevo niti ne potrebuješ sprejema v prekinitvi, naredi tako kot ti je predlagal Ivan, s tem da bi jaz dodal še $Timeout, da program nebi izvisel če ne dobi odgovora.

Vlado
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
RudiP
Profesionalec


Pridružen/-a: Sre Jul 2008 8:39
Prispevkov: 128
Kraj: KOPER

PrispevekObjavljeno: Sre Jun 02, 2010 5:59 pm    Naslov sporočila: Odgovori s citatom

Piši lepše, da si ostali ne razbijamo možgane.

Predlagam ti naslednjo kodo. V kolikor ti ni jasna vprašaj.

Koda:


Dim Rx_fifo(20) As Byte                 'SPREJEMNI BUFFER  obdeluješ jih kot bayte
Dim Rx_fifo_string As String * 20 At Rx_fifo Overlay       'SPREJEMNI BUFFER  obdeluješ kot string
Dim Rs_rx_flag As Bit
Dim Rs_rx As Byte                       ' INDEX LOKACIJE
Dim I As Byte
Dim A As Byte
Dim B As Byte

On Urxc Rec_isr                                             'define serial receive ISR
Enable Urxc

Rs_rx = 1
Enable Interrupts

'*******************************************************************************
Do

'Debounce Pind.3 , 0 , Zagon , Sub Glavna    '
'Debounce Pind.2 , 0 , Ustavi , Sub Glavna   '

   If Rs_rx_flag = 1 Then
      Reset Rs_rx_flag

   
      For I = 1 To rs_rx
          Lcd Hex(rx_fifo(i))   ' v kolikor imaš alfanumerični lcd display
          B = Rx_fifo(i)
          If B = "=" Then Exit For

      Next I
      Incr I

      'OD TU NAPREJ JE INFORMACIJA, KATERO RABIŠ

      Rs_rx = 1
   End If
Loop

'****************** SERIAL INTERRUPT SERVICE RUTINE **************************
Rec_isr:

  A = Inkey()
  If A > 0 Then
'     Lcd Chr(a)
     Incr Rs_rx
     Rx_fifo(rs_rx) = A
     If A = 13 Then Set Rs_rx_flag
  End If
Return


_________________
Lep pozdrav !
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
besoft
Profesionalec


Pridružen/-a: Čet Maj 2010 10:26
Prispevkov: 98

PrispevekObjavljeno: Ned Jun 06, 2010 8:19 am    Naslov sporočila: Odgovori s citatom

Hvala za kodo. Z malimi spremembami zadeva deluje tako kot sem želel. Se pa opravičujem zaradi poznega odgovora, zaradi kroničnega pomankanja časa, sem komaj zdaj lahko poskusil primer...
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo    Kazalo po Svet elektronike forumu -> Digitalna elektronika Časovni pas GMT + 1 ura, srednjeevropski - zimski čas
Stran 1 od 1

 
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
You cannot attach files in this forum
You cannot download files in this forum


Powered by phpBB © 2001, 2005 phpBB Group