PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit der serielle Kommunikation



Florian.
20.12.2007, 20:39
Hallo,

ich habe vor mit meinem Mega32 ein GSM Modem per rs232 anzusteuern. Die Verbindung funktioniert soweit auch, das Problem liegt viel mehr an meinen schlechten Kenntnissen was Programmierung und Bascom angeht.
Vom Atmel zum Modem ist kein Problem, einfach print. Funktioniert auch alles. Nur die andere Richtung beschäftigt mich jetzt schon seit einer Woche mit kleinen Erfolgen, allerdings läuft es noch nicht so wie ich es mir vorstelle.

Schicke ich mit print einen AT-Befehl ans Modem, so antwortet dieses darauf. Als Variable für die Antwort kommt eigentlich nur ein String in Frage dessen Länge variiert. Je nachdem welchen Befehl das Modem erhalten hat. Allerdings weiss ich auch nicht wie lange das Modem für die Verarbeitung des Befehls braucht und somit müsste der Atmel auf den Befehl warten, also immer empfangsbereit sein.

Ich bin mir nicht sicher, aber glaube mit dem urxc Interrupt arbeiten zu müssen. Nur wie sieht der Code innerhalb der ISR aus? Muss ich dort dann mit dem Input Befehl arbeiten?

Über eine Beispiel ISR wäre ich sehr dankbar

Gruss

Florian.

for_ro
20.12.2007, 20:58
Hallo,
da kommt nicht am Ende immer das gleiche Zeichen vom Modem als Abschluss der Übertragung, oder?
Dann könntest du einen Interrupt auslösen lassen, wenn dieses Zeichen im Input Buffer ist.

Gruß

Rolf

Florian.
20.12.2007, 21:07
Hallo,

nein, kommt weder am Anfang noch am Ende ein einheitliches Zeichen.

Trotzdem Danke für den Tipp

Florian.
21.12.2007, 18:01
Vielleicht habe ich mich einfach nur undeutlich ausgedrückt. Wie wird es in Bascom denn normalerweise umgesetzt wenn man auf Zeichen von der seriellen Schnittstelle wartet um dieses anschließend auf einem LCD auszugeben?

Gruss Florian.

#fritz#
30.11.2011, 18:09
Bist Du schon weiter gekommen ?
Ich habe das gleiche Problem zu lösen.

Danke

peterfido
30.11.2011, 18:53
In knapp 4 Jahren sollte ihm eine Lösung eingefallen sein.

Ich nutze gern die ischarwaiting() Methode. Funktioniert bisher immer zuverlässig. Siehe meine Antwort in dem Thread (https://www.roboternetz.de/community/threads/55681-Fehler-bei-Daten%C3%BCbertragung-Auswertung). Statt auf 37 wird normal auf 13 geprüft. Die 37 ist nur Topic Spezifisch. Ich ignoriere normal auch die 10.


Hier ein Kurzbeispiel:


$regfile = "m32def.dat" ' specify the used micro
$crystal = 8000000 ' used crystal frequency
$baud = 19200


$hwstack = 42 ' default use 32 for the hardware stack
$swstack = 40 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
Config Graphlcd = 240 * 64 , Dataport = Porta , Controlport = Portc , Ce = 2 , Cd = 3 , Wr = 0 , Rd = 1 , Reset = 4 , Fs = 6 , Mode = 8
Enable Interrupts


Dim Sbuffer As String * 30 '
Dim Seingang As String * 30
Dim B As Byte


Do

If Ischarwaiting() = 1 Then
Gosub Empfangen
End If

Loop

End

Empfangen:

B = Inkey()
If B >= 13 Then
If B = 13 Then
Seingang = Sbuffer
Sbuffer = ""
Gosub Auswerten
Else
If Len(sbuffer) < 30 Then
Sbuffer = Sbuffer + Chr(b)
Else
Sbuffer = ""
' Print "...Fehler..."
End If
End If
End If

Return

Auswerten:
Locate 1 , 1
Lcd Seingang


Return