Atmega/BASCOM: SMS über UART aus Handy auslesen?

Gast #1485263
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
Gast #1485267
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.
Gast #1485286
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.
Gast #1485443
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
Gast #1485564
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.
#1485901
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren