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

Gast #1485263
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
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
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
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
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.
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.