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


 
Pridružen-a: Tor 01 Avg 2006 10:47 Prispevkov: 5530 Aktiv.: 24.06 Kraj: Domzale
|
Objavljeno: Tor Jan 23, 2007 2:14 pm Naslov sporočila: Bascom AVR - branje teksta preko UARTa |
|
|
LP!
Zanima me najenostavnejša procedura za branje (oz. nadaljnjo obdelavo) teksta, ki ta prejmem preko UARTa; pri tem ne dobim samo enostavnih znakov (npr številke, OK, ...), temveč tudi daljše nize.
Kako jih shraniti (kot kaj, string?) in kako naprej brati?
(npr dobim string "CSQ = 30") - kako najenostavneje priti zgolj do številke 30?
LP, Grega |
|
Nazaj na vrh |
|
 |
trot Član


Pridružen-a: Čet 18 Jan 2007 20:25 Prispevkov: 1282 Aktiv.: 5.72 Kraj: glej fogl
|
Objavljeno: Tor Jan 23, 2007 3:05 pm Naslov sporočila: |
|
|
Če imaš znan protokol. potem npr. bereš številko na npr. petem mest, ali pa za presledkom oz. je enako. |
|
Nazaj na vrh |
|
 |
Vlado Član

Pridružen-a: Sre 03 Mar 2004 21:35 Prispevkov: 563 Aktiv.: 2.38 Kraj: Ljubljana
|
Objavljeno: Tor Jan 23, 2007 3:25 pm Naslov sporočila: Branje teksta prek UARTa |
|
|
Graga,
za začetek svetujem da poskusiš s terminal emulatorjem sprejemati podatke. Kako obdelovati podatke pa je vprašanje koliko različnih podatkov pričakuješ. V primeru da jih ni veliko jih lahko daš v tabelo in obdeluješ na ta način. Odgovor na konkretno vprašanje pa je:
če za podatkom CSQ = xx vedno pričakuješ številko lahko v tem podatku poiščeš znake ki predstavljajo številko. Lahko pa enostavno izločiš "CSQ =" in tisto kar ti ostane je podatek ki te zanima.
Poglej ukaze "LEN", "INSTR" . . . .
Tudi Samplesi so dobri za pomoč.
Vlado |
|
Nazaj na vrh |
|
 |
mucek Član


 
Pridružen-a: Tor 01 Avg 2006 10:47 Prispevkov: 5530 Aktiv.: 24.06 Kraj: Domzale
|
Objavljeno: Tor Jan 23, 2007 4:24 pm Naslov sporočila: |
|
|
LP!
Najprej hvala za odgovore!
Tako kot je napisal Vlado delam že sedaj (znam npr. izločiti iskano trimestno številko iz niza drugih podatkov z metodo, da gledam predhodne znake in dolžino števila), zanima me, če obstaja kakšna lažja pot kot nenehno spremljanje stringov, ki prihajajo v buffer. Tovrstno preverjanje namreč pri veliko ukazih pobere precej pomnilnika, ki ga ni nikoli dovolj (Bascom
Z LEN in INSTR ukazoma pa še nisem delal, a sta, kot vidim, uporabna! Bom poskusil storiti kaj v tej smeri...
LP, Grega |
|
Nazaj na vrh |
|
 |
mucek Član


 
Pridružen-a: Tor 01 Avg 2006 10:47 Prispevkov: 5530 Aktiv.: 24.06 Kraj: Domzale
|
Objavljeno: Sre Jan 24, 2007 2:38 pm Naslov sporočila: |
|
|
LP!
Z INSTR ikazom zadeva lepo deluje, vendar se mi pojavi drug problem:
V kodi
Do
Lcd "Kontrola modema"
Print "AT"
Input , Komunikacija
Ok = Instr(komunikacija , "OK")
If Ok = 1 Then
Goto Nadaljevanje
End If
Loop
želim kontrolirati delovanje GSM modema - ali mi vrne OK ali ne. Vendar Loop ne deluje, ker se zadeva pri ukazu input ustavi (čaka, da nekaj dobi).
Kakor mu pošljem karkoli, zanka steče in modemu spet vrne ukaz AT.
Kako bi lahko naredil, da bi zanka stalno tekla (program bi stalno oddajal ukaz AT in čakal, da dobi nazaj OK, nato pa šel naprej)?
Pa še eno enostavno vprašanje (ki pa ga mi še ni uspelo rešiti, čeprav izgleda trivialno) - kako informacijo shraniti v interni EEPROM čipa (M8515)?
Npr. imam spremenljivko
dim spremenljivka as long
in jo želim zapisati v eeprom in spet prebrati. Sem poskusil tako, kot je v primerih za readeeprom in writeeeprom, pa mi ni uspelo... Je treba še v začetku nastaviti kakšne posebne spremenljivke, kje "programsko vklopiti" eeprom itd?
LP, Grega |
|
Nazaj na vrh |
|
 |
Vlado Član

Pridružen-a: Sre 03 Mar 2004 21:35 Prispevkov: 563 Aktiv.: 2.38 Kraj: Ljubljana
|
Objavljeno: Sre Jan 24, 2007 4:32 pm Naslov sporočila: Bascom AVR branje teksta preko UART-a |
|
|
Grega,
prej nisi povedal da gre za GSM modem.
Priklopi GSM modem na terminal in opazuj kaj pošilja pri odgovoru.
Na ukaz AT GSM odgovori z
"CR LF"
"CR LF"
"OK"
"CR LF"
Lahko poskusiš z Serial interrupt-om.
Najbolje bi bilo da si pogledaš primer komunikacije z GSM modemom katerega najdeš na MCS-ovi strani med Sampli.
Za vpis in branje EEproma imaš dva načina:
Writeeeprom in readeeprom, ali pa Dim X as eramlong (erambyte,string . . .).
Včasih pomaga če malo pogledaš Help in primere ki so zraven programa.
Vlado |
|
Nazaj na vrh |
|
 |
mucek Član


 
Pridružen-a: Tor 01 Avg 2006 10:47 Prispevkov: 5530 Aktiv.: 24.06 Kraj: Domzale
|
Objavljeno: Čet Jan 25, 2007 1:30 pm Naslov sporočila: |
|
|
LP!
Vlado, hvala za pomoč!
AT ukaze (in odgovore) modema poznam, zanima me, kako brati izbrani del znotraj stringa; tu je moa procedura za branje SMSa, pri čemer moram znotraj SMSja s specifično obliko razbrati 8 številk:
'procedura za prejemanje SMSjev
Cls
Cursor Off
Dim Sprejem As String * 25
Dim Sporocilo As String * 25
Dim Spr As Byte
Dim Sstevilka As String * 8
Dim Stevilka As Long
Main:
Spr = 0
Sprejem:
'Preverjanje, ali je prislo sporocilo
Cls
Lcd "Sprejemam..."
Wait 1
Print "AT+CPMS=MT"
Input , Sprejem
Spr = Instr(sprejem , "CPMS: 1")
If Spr = 1 Then
Goto Preverjanje
End If
Goto Sprejem
Preverjanje:
'ce ni prava oblika ga zbrisi
'oblika: -xxxx-xx-xxxxxxxx- (-geslo-ukaz-telefonska brez 0-
'sicer ga preberi
Cls
Lcd "Preverjam..."
Wait 1
Spr = 0:
Print "AT+CMGR=1"
Input , Sporocilo
Spr = Instr(sporocilo , "-1111-11-")
If Spr = 1 Then
Goto Branje
End If
Goto Brisanje
Branje:
'branje sporocila v stringu Sporocilo od ENTER naprej
Cls
Lcd "Branje..."
Wait 1
'TU MORAM UGOTOVITI; KAKO PREBRATI VREDNOST, KI SE NAHAJA MED "-1111-11-" in "-"
'NATO MORAM TA DEL PRETVORITI V NOV STRING sstevilka IN NATO TEGA V SPREMENLJIVKO
'STEVILKA TIPA LONG.
Stevilka = Val(sstevilka)
Goto Brisanje
Brisanje:
Cls
Lcd "Brisem..."
Wait 1
Print "AT+CMGD=1"
Waitms 250
Waitms 250
Goto Main:
|
|
Nazaj na vrh |
|
 |
Vlado Član

Pridružen-a: Sre 03 Mar 2004 21:35 Prispevkov: 563 Aktiv.: 2.38 Kraj: Ljubljana
|
Objavljeno: Čet Jan 25, 2007 2:33 pm Naslov sporočila: BASCOM AVR-branje teksta preko uarta |
|
|
Grega,
poglej ukaze "Mid", "Left" in "Right", mislim da ti bodo v pomoč.
ti ukazi so uporabljeni tudi v primeru na MCS-ovi strani.
Vlado
P.S.
Print "AT+CMGR=1"
Input , Sporocilo
V tem primeru bo string sporočilo vedno "" !!!!
Poglej prejšnji post še enkrat |
|
Nazaj na vrh |
|
 |
mucek Član


 
Pridružen-a: Tor 01 Avg 2006 10:47 Prispevkov: 5530 Aktiv.: 24.06 Kraj: Domzale
|
Objavljeno: Čet Jan 25, 2007 2:54 pm Naslov sporočila: |
|
|
Ne, ne bo, ker sporočilo vedno izbrišem za seboj, tako da je vsako novo sporočilo na lokaciji 1, ki jo kličem z ukazom AT+CMGR=1.
Vsaj pri testiranju s HyperTerminalom dela tako...
LP, Grega
p.s. dim xxx as ERAM long v teoriji deluje kot odličen ukaz, a v praksi javlja napako; xxx should be numeric valve, če je koda
dim xxx as ERAM long
xxx = 123123
If xxx > 100000 then
...
Kaj je narobe? |
|
Nazaj na vrh |
|
 |
Vlado Član

Pridružen-a: Sre 03 Mar 2004 21:35 Prispevkov: 563 Aktiv.: 2.38 Kraj: Ljubljana
|
Objavljeno: Čet Jan 25, 2007 6:40 pm Naslov sporočila: Bascom AVR branje teksta preko UART-a |
|
|
Grega,
Citiram: |
Ne, ne bo, ker sporočilo vedno izbrišem za seboj, tako da je vsako novo sporočilo na lokaciji 1, ki jo kličem z ukazom AT+CMGR=1.
|
tukaj ne gre za lokacijo, po ukazu GSM pošlje "CR LF" "CR LF", tvoj procesor bo sprejel drug "CR LF" kar je enako ""!
To kar delaš z terminal emulatorjem moraš preizkusiti tudi s procesorjem.
Če uporabljaš Bray-ev terminal emulator lahko opazuješ tudi vrednosti ki jih kot string ne vidiš.
Vidim pa da še vedno nisi preučil tistega primera iz katerega bi se lahko veliko naučil.
Zakaj ti ukaz dim xxx as ERAM long :xxx = 123123 javi napako?
Če boš bolj natančno prebral Help boš videl da s to spremenljivko ne moreš delati tako kot ti delaš:
dim xxx as ERAM long ,DIM N AS LONG
N=123123
xxx=N ' vpis v EEprom
N=xxx ' bere iz EEproma
Razlika med tem ukazom in Writeeeprom je v tem da v tem primeru imaš že določeno lokacijo v eepromu na katero bo spremenljivka vpisana, če pa uporabljaš Writeeeprom morš vedno vedeti kam boš shranil podatek. Pri tem moraš upoštevati da izvrševanje tega ukaza ne poteka tako hitro kot pisanje v ram ali zunanji ram.
Vlado |
|
Nazaj na vrh |
|
 |
mucek Član


 
Pridružen-a: Tor 01 Avg 2006 10:47 Prispevkov: 5530 Aktiv.: 24.06 Kraj: Domzale
|
Objavljeno: Čet Jan 25, 2007 7:19 pm Naslov sporočila: |
|
|
Hvala, imaš prav.
Delal sem s hyperterminalom, sedaj sem si naložil bray terminalski program in so res razlike med obema prikazoma...
Glede eeproma... Sedaj se mi zdi čisto logično (ko si napisal za kaj gre...), prej mi pa ni šlo skupaj zakaj tako...
Primera za mc35 na mcsjevi strani za AVR nisem našel, res pa da nisem gledal na 8051... Bom jutri še to preveril!
LP, Grega |
|
Nazaj na vrh |
|
 |
Vlado Član

Pridružen-a: Sre 03 Mar 2004 21:35 Prispevkov: 563 Aktiv.: 2.38 Kraj: Ljubljana
|
Objavljeno: Čet Jan 25, 2007 7:43 pm Naslov sporočila: Bascom AVR branje teksta preko uarta |
|
|
Grega,
primera za Mc35 ne boš našel, je pa primer za M1. Služi naj ti predvsem kot pomoč pri tvojem projektu. Pred časom je gor bil še en primer SMS.bas (za AT90S2313 pa sem zdaj videl da ga ni več, lahko pa ga poiščem in ti ga pošljem) ta program je pošiljal in bral SMS v text modu.
Vlado |
|
Nazaj na vrh |
|
 |
mucek Član


 
Pridružen-a: Tor 01 Avg 2006 10:47 Prispevkov: 5530 Aktiv.: 24.06 Kraj: Domzale
|
Objavljeno: Sre Feb 21, 2007 2:34 pm Naslov sporočila: |
|
|
LP!
Ker je primer meni bil v veliko korist, na MCSjevi strani pa ga ni več, ga objavljam tule:
'------------------------------------------------------------------------------
' SMS.BAS
' (c) 2002 MCS Electronics
' This sample shows how to use AT command on a GSM mode
' The GSM modems are available from www.mcselec.com
'------------------------------------------------------------------------------
'tested on a 2314
$sim
$regfile = "8515def.dat" '"2313def.dat"
'XTAL = 10 MHZ
$crystal = 10000000
'By default the modem works at 9600 baud
$baud = 9600
'HW stack 20, SW stack 8 , frame 10
'some subroutines
Declare Sub Getline(s As String)
Declare Sub Flushbuf()
Declare Sub Showsms(s As String )
'used variables
Dim I As Byte , B As Byte
Dim Sret As String * 66 , Stemp As String * 6
'we use a serial input buffer
Config Serialin = Buffered , Size = 12 ' buffer is small a bigger chip would allow a bigger buffer
'enable the interrupts because the serial input buffer works interrupts driven
Enable Interrupts
'define a constant to enable LCD feedback
Const Uselcd = 1
Const Senddemo = 1 ' 1= send an sms
Const Pincode = "AT+CPIN=1234" ' pincode change it into yours!
Const Phonenumber = "AT+CMGS=+31653123456" ' phonenumber to send sms to
#if Uselcd = 1
Cls
Lcd "SMS Demo"
#endif
'wait until the mode is ready after power up
Waitms 3000
#if Uselcd = 1
Lcd "Init modem"
#endif
Print "AT" ' send AT command twice to activate the modem
Print "AT"
Flushbuf ' flush the buffer
Print "ATE0"
#if Uselcd = 1
Home Lower
#endif
Do
Print "AT" : ' Waitms 100
Getline Sret ' get data from modem
#if Uselcd = 1
Lcd Sret ' feedback on display
#endif
Loop Until Sret = "OK" ' modem must send OK
Flushbuf ' flush the input buffer
#if Uselcd = 1
Home Upper : Lcd "Get pin mode"
#endif
Print "AT+cpin?" ' get pin status
Getline Sret
#if Uselcd = 1
Home Lower : Lcd Sret
#endif
If Sret = "+CPIN: SIM PIN" Then
Print Pincode ' send pincode
End If
Flushbuf
#if Uselcd = 1
Home Upper : Lcd "set text mode"
#endif
Print "AT+CMGF=1" ' set SMS text mode
Getline Sret ' get OK status
#if Uselcd = 1
Home Lower : Lcd Sret
#endif
'sms settings
Print "AT+CSMP=17,167,0,0"
Getline Sret
Print "AT+CNMI=0,1,2,0,0"
Getline Sret
#if Senddemo = 1
#if Uselcd = 1
Home Upper : Lcd "send sms"
#endif
Print Phonenumber
Waitms 100
Print "BASCOM AVR SMS" ; Chr(26)
Getline Sret
#if Uselcd = 1
Home Lower : Lcd Sret 'feedback
#endif
#endif
'main loop
Do
Getline Sret ' wait for a modem response
#if Uselcd = 1
Cls
Lcd "Msg from modem"
Home Lower : Lcd Sret
#endif
I = Instr(sret , ":") ' look for :
If I > 0 Then 'found it
Stemp = Left(sret , I)
Select Case Stemp
Case "+CMTI:" : Showsms Sret ' we received an SMS
' hanle other cases here
End Select
End If
Loop ' for ever
'subroutine that is called when a sms is received
's hold the received string
'+CMTI: "[slovenščina je zame španska vas]",5
Sub Showsms(s As String )
#if Uselcd = 1
Cls
#endif
I = Instr(s , ",") ' find comma
I = I + 1
Stemp = Mid(s , I) ' s now holds the index number
#if Uselcd = 1
Lcd "get " ; Stemp
Waitms 1000 'time to read the lcd
#endif
Print "AT+CMGR=" ; Stemp ' get the message
Getline S ' header +CMGR: "REC READ","+316xxxxxxxx",,"02/04/05,01:42:49+00"
#if Uselcd = 1
Lowerline
Lcd S
#endif
Do
Getline S ' get data from buffer
Select Case S
Case "PORT" : 'when you send PORT as sms text, this will be executed
#if Uselcd = 1
Cls : Lcd "do something!"
#endif
Case "OK" : Exit Do ' end of message
Case Else
End Select
Loop
#if Uselcd = 1
Home Lower : Lcd "remove sms"
#endif
Print "AT+CMGD=" ; Stemp ' delete the message
Getline S ' get OK
#if Uselcd = 1
Lcd S
#endif
End Sub
'get line of data from buffer
Sub Getline(s As String)
S = ""
Do
B = Inkey()
Select Case B
Case 0 'nothing
Case 13 ' we do not need this one
Case 10 : If S <> "" Then Exit Do ' if we have received something
Case Else
S = S + Chr(b) ' build string
End Select
Loop
End Sub
'flush input buffer
Sub Flushbuf()
Waitms 100 'give some time to get data if it is there
Do
B = Inkey() ' flush buffer
Loop Until B = 0
End Sub |
|
Nazaj na vrh |
|
 |
Vlado Član

Pridružen-a: Sre 03 Mar 2004 21:35 Prispevkov: 563 Aktiv.: 2.38 Kraj: Ljubljana
|
Objavljeno: Sre Feb 21, 2007 4:08 pm Naslov sporočila: Bascom AVR branje teksta preko UARTa |
|
|
Grega,
avtor je verjetno imel razlog da je kodo umaknil z MCS-ove strani.
Vlado |
|
Nazaj na vrh |
|
 |
mucek Član


 
Pridružen-a: Tor 01 Avg 2006 10:47 Prispevkov: 5530 Aktiv.: 24.06 Kraj: Domzale
|
Objavljeno: Čet Feb 22, 2007 9:54 am Naslov sporočila: |
|
|
Oj!
Ja, po mojem je bil razlog umika sampla ta, da MCS ni več prodajal omenjenih modemov.
Če se ti zdi da je objava sporna, jo bom seveda zbrisal, vendar se mi zdi škoda, ker verjamem, da bo še marsikomu koristila...
LP, Grega |
|
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: 494 dni
Powered by phpBB © 2001, 2005 phpBB Group
|