Forum: Mikrocontroller und Digitale Elektronik Atmega/BASCOM: SMS über UART aus Handy auslesen?


von Phillip (Gast)


Lesenswert?

Hallo,
ich hab die verwandten Themen hier im Forum gelesen.
Trotzdem komme ich nicht weiter:

Ich möchte mit einem Atmega über die UART aus einem Handy SMSen im 
Textmodus auslesen. Es gelingt es mir nicht, zu erkennen, ob die UART 
ein Zeichen empfangen hat, obwohl die Kommunikation mit dem Handy an 
sich funktioniert (siehe Listing Teil 1 und 2)

Bin für jeden Tip dankbar

Phillip
1
$regfile = "m8def.dat"
2
$crystal = 3686400
3
$baud = 9600
4
5
Config Lcd = 16 * 2
6
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
7
Config Lcdbus = 4
8
9
10
Dim S As String * 10
11
12
On URXC OnRxD
13
Enable URXC
14
Enable Interrupts
15
16
17
18
19
20
'  ---------------------------------------------------------------
21
'  ---------------- 1. Teil: Rufaufbau. funktioniert -------------
22
'  ---------------------------------------------------------------
23
24
'Locate 1 , 1
25
'Lcd "Sende ATZ"
26
'Print "atz"
27
'Waitms 200
28
29
30
'Locate 1 , 1
31
'Lcd "Sende ATDT 0172xxxxxxx"
32
'Print "atdt 0172xxxxxxx"
33
'Waitms 200
34
35
36
'  ---------------------------------------------------------------
37
'  ---------------- 2. Teil: SMS senden. funktioniert ------------
38
'  ---------------------------------------------------------------
39
40
'Locate 1 , 1
41
'Lcd "SMS senden...    "
42
'Waitms 2000
43
44
'Locate 1 , 1
45
'Lcd "Textmodus...     "
46
'Print "at+cmgf=1" ; Chr(13)
47
'Waitms 200
48
49
'Locate 1 , 1
50
'Lcd "Rufnummer...     "
51
'Print "at+cmgs=" ; Chr(34) ; "0172xxxxxxx" ; Chr(34) ; Chr(13)
52
'Waitms 200
53
54
'Locate 1 , 1
55
'Lcd "SMS-Text...      "
56
'Print "Hier steht der Text der SMS" ; Chr(13)
57
'Waitms 200
58
'Print Chr(26) ; Chr(13)
59
'Wait 10
60
61
62
'  ---------------------------------------------------------------
63
'  ---------------- 3. Teil: SMS empfangen: klappt nicht ---------
64
'  ---------------------------------------------------------------
65
66
67
Cls
68
Locate 1 , 1
69
Lcd "SMS empfangen... "
70
Waitms 2000
71
72
73
Locate 1 , 1
74
Lcd "Echo ein         "
75
Print "ate1"
76
Waitms 2000
77
78
79
Locate 1 , 1
80
Lcd "Textmodus ein    "
81
Print "at+cmgf=1"
82
Waitms 2000
83
84
85
Abfragesms:
86
87
Locate 1 , 1
88
Lcd "Abfrage SMS      "
89
Print "at+cmgl"
90
Waitms 5000
91
92
93
Goto Abfragesms
94
95
96
Onrxd:
97
Sms:
98
Locate 1 , 1
99
Lcd "SMS gefunden      "
100
Goto Sms
101
Return
102
103
104
End

von MeinerEiner (Gast)


Lesenswert?

Lcd "SMS gefunden      " in ner Interruptroutine ist böse.
Es wird doch sicher nicht nur 1 Zeichen kommen, d.h. der Interrupt wird 
ausgelöst noch bevor er beendet ist => Chaos.
Ausserdem ist diese ISR ja ne Endlosschleife in sich.

von MWS (Gast)


Lesenswert?

Außerdem liest Du UDR nicht aus, solange Du das nicht machst wird die 
ISR immer wieder aufgerufen.

>> When interrupt-driven data reception is used, the receive complete
>> routine must read the received data from UDR in order to clear the
>> RXC Flag, otherwise a new interrupt will occur once the interrupt
>> routine terminates.

von Phillip (Gast)


Lesenswert?

Hallo,
danke für Eure Tips.
Jetzt lese ich das Byte aus der UART aus und steuere das Display 
ausserhalb der ISR an. Trotzdem bleibt der String S leer :-(
1
$regfile = "m8def.dat"
2
$crystal = 3686400
3
$baud = 9600
4
5
Config Lcd = 16 * 2
6
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
7
Config Lcdbus = 4
8
9
Dim S As String * 10 , I As Byte
10
11
On Urxc Onrxd:
12
Enable Urxc
13
Enable Interrupts
14
15
'  ---------------------------------------------------------------
16
'  ---------------- 3. Teil: SMS empfangen: klappt nicht ---------
17
'  ---------------------------------------------------------------
18
19
Cls
20
Locate 1 , 1
21
Lcd "SMS empfangen... "
22
Waitms 2000
23
24
Locate 1 , 1
25
Lcd "Echo ein         "
26
Print "ate1"
27
Waitms 2000
28
29
Locate 1 , 1
30
Lcd "Textmodus ein    "
31
Print "at+cmgf=1"
32
Waitms 2000
33
34
S = ""
35
36
Abfragesms:
37
Locate 1 , 1
38
Lcd "Abfrage SMS      "
39
Print "at+cmgl=0"
40
Waitms 5000
41
S = S + Chr (I)
42
Locate 2 , 1
43
Lcd ">" ; S ; "<"
44
Goto Abfragesms
45
46
Onrxd:
47
I = Udr
48
Return
49
50
End

von MeinerEiner (Gast)


Lesenswert?

Hier hast du das Problem, dass Zeichen verloren gehen, wenn die 
Übertragungsgeschwindigkeit grösser als 1 Zeichen / 5 Sekunden ist.
Du wartest 5 Sekunden und schreibst dann das letzte empfangene Zeichen 
zu S dazu. Alle Zeichen, die innerhalb dieser 5 Sekunden davor kamen, 
sind weg.

Bascom kann selbst mit einem Puffer arbeiten.
"Config Serialin" o.ä. müsste das gewesen sein.

von Joachim R. (bastelbaer)


Lesenswert?

Probiers doch mal mit
Config Serialin = Buffered , Size = 50
Enable Interrupts

und

If Ischarwaiting() = 1 Then
  Sms_rec_char = Waitkey()
  ' tu was damit

Damit liest der Atmel im Hintergrund interruptgesteuert die serielle ein 
und legt die Zeichen in einen Puffer den du dann mit Waitkey auslesen 
kannst. Wenn Size gross genug ist, dann klappt das mit der kompletten 
SMS. Braucht natürlich RAM, klappt aber gut.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.