Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: RS232 Kategorie: Programmierung Basic (von erzgebirgler47 - 18.02.2010 17:39)
Als Antwort auf Re: RS232 von PeterS - 18.02.2010 11:17
Ich nutze:
C-Control Pro Mega128
Hallo Peter,

ich arbeite mit dem Projektboard und mit RS232 (Das Projektboard hat ja keine echte USB, sondern
schickt alles über den MAX. Es ist mir schon klar, das ich die IDE wegschalten muss, wenn ich das
Terminal benutze. Habe ich auch gemacht. Habe auch noch mal alles "Elektrische" mit Oszi geprüft.
Betriebsspannung ok ohne Spikes. Leitungen zum MAX ok, ohne Spikes. Benachbarte Pins ebenfalls
ohne Spikes. Ich bin ja eigentlich kein Neuling. Ich programmiere schon seit über 30 Jahren, allerdings
auf anderen Plattformen, angefangen mit echtem HEX-Code für den Ost-Typ des Z 80 über mehrere
unterschiedliche höhere Sprachen, au�er C und dessen Derivate, wenn man mal von einem Ausflug zu
Turbopascal absieht.
Ich habe das Verhalten mit dem Oszi geprüft und festgestellt, dass es jedesmal erst bei der
Initialsierung der RS232 passiert und das offensichtlich mehrere Zeichen mit sehr hoher
Geschwindigkeit gesendet werden. Wenn man auf 19200 runter initialisiert, bleibt dann nur ein
fehlerhaftes Zeichen übrig, weil die Schnittstelle das nicht mehr auseinanderhalten kann. Man siehts
nur auf dem Oszi. Leider habe ich kein Speicheroszi, so dass ich kein Bild mitschicken kann.
Ich habe nun vorerst mal meiner Gegenstelle eine entsprechende Prüfung verordnet.
Leider habe ich noch ein paar andere kleinere Probleme entdeckt und ein Interruptproblem dazu.
Der Serialinterupt wird vom Interpreter oder was Du auch noch dahintergelegt hast in gewissen
Grenzen abgearbeitet. Allerdings, so wie man das von anderen Sprache gewöhnt ist, ein Sprung
in eine frei programierbare Routine (sicher nicht zu lang) erfolgt weder vom Serialinterupt noch von
internen Timerinterupten. Hardwareinterupte habe ich nicht geprüft. Ich wollte erst mal statt des
ständigen Abfragen des Serial_IRQ_Info in der Main dies über eine Timerüberlauf oder einen anderen
Timertick machen. War nichts. Es erfolgt trotz Intitialisierung mit Zeiger wie in den Beispiel-
programmen kein Aufruf der Sub. Hab es deshalb erstmal wieder rausgenommen.
Nachfolgend noch der Quellcode mit Kommentaren zu den entdeckten Ungereimtheiten (auch im
Handbuch).
GruÃ? Erzgebirgler47

' RS232_IRQ: Interrupt Verarbeitung
' In diesem Programm werden die neuen Möglichkeiten der Interrupt
' Verarbeitung der seriellen Routinen demonstriert.
' Das Programm wartet 5 Sek. und gibt die bis dahin empfangenen
' Zeichen aus.  Wartezeit anders verteilt
' erforderliche Library: IntFunc_Lib.cc

' 35 byte Sende + Empfangspuffer + 6 byte interne FIFO Verwaltung
' Versuche zeigen > zu wenig
' aber selbst mit diesem riesigen Puffer (siehe unten) läuft er nur
' bis etwa zur folgenden Zeichenmenge einwandfrei: "abcdefghijklmonpq",
' ein Zeichen mehr (hier mit "r" versucht), und er bleibt vollständig
' hängen, gleiches gilt bei der �bermittlung von Ziffern oder Werten Bin oder Hex

#define LF 0x0A
#define CR 0x0D
Dim Puffer(250) As Byte                              ' Array deklariert
Dim Text3(20) As Char
'------------------------------------------------------------------------------
' Hauptprogramm
'

Sub main()
Dim i As Integer
Dim j As Integer

Dim Text1(40), Text2(5) As Char
    Text1=" .Test2 Text"
    Text2=""
    ' Init RS232: 19200 bps, 8 Bit, 1 Stop, NP
    Serial_Init(0,SR_8BIT Or SR_1STOP Or SR_NO_PAR,SR_BD19200)
    AbsDelay(50)
    'alt 5000 > hat bis auf das erste Zeichen funktioniert
    'Verkürzung auf 50 hat keine anderen Ergebnisse gebracht
    'Bei der Initialisierung werden bzw. wird offensichtlich
    'ein oder mehrere undefinierbare Zeichen zur Schnittstelle
    'geschickt
    'mit Lesegschwi. von 300 bis 115200 war kein klares Zeichen
    'zu erkennen
    'Ist dann die Initialisierung abgeschlossen,
    'läuft (bis auf den INT) alles wie es sein sollte
    'Weder der Serial_Int noch Timer_Int's führen zu einem Sprung
    'in eine (beim Timer_int)zugewiesene sub

    Serial_Init_IRQ(0,Puffer,150,50,SR_8BIT Or SR_1STOP Or SR_NO_PAR,SR_BD19200)
    'Fehlt hier nicht eigentlich eine Zuordnung des Int zu einer routine(zeiger)?

For j=0 To 10
    Str_WriteInt(j ,Text2,0)
    Serial_WriteText(0,Text2)                       ' CR und LF ausgeben
    Serial_WriteText(0,Text1)                       ' CR und LF ausgeben
    Serial_Write(0,CR)                       ' CR und LF ausgeben
    Serial_Write(0,LF)                       ' CR und LF ausgeben

    Thread_Delay(1000)
    If Serial_IRQ_Info(0,RS232_FIFO_RECV) <> 0 Then
    Zeichenauslesen()
    End If


Next
Serial_WriteText(0,"Ende des Tests")
Serial_Write(0,CR)                       ' CR und LF ausgeben
Serial_Write(0,LF)

End Sub

Sub Zeichenauslesen()
    Dim Daten_Buffer(20) As Byte
    Dim Buffer_Cnt As Integer
    Dim Command As Byte
    Dim sz As Integer
    Dim Buffer_Index As Integer

    Text3="Zeichenauslesen"
    Serial_WriteText(0,Text3)
    Serial_Write(0,CR)                       ' CR und LF ausgeben
    Serial_Write(0,LF)
'nochmal prüfen, wie viele Zeichen empfangen wurden
Buffer_Cnt = Serial_IRQ_Info(0,RS232_FIFO_RECV)
If Buffer_Cnt <> 0 Then  'es sind Daten da?

Do While True    'jetzt Daten einlesen
Buffer_Index = Buffer_Index + 1  'Buffer-Index-Zähler
sz=Serial_ReadExt(0)  'Puffer auslesen
'Der Code ist aus den Original-Beipielen, dabei gibt es aber einige
    'Widersprüche zwischen der Beschreibung und den Beispielen:
    'Definition lt. Hilfe bzw. Handbuch
    'Serial_ReadExt(serport As Byte) As Word > Funktion liefert Word !!
    'Beschreibung:
    'Ein byte wird von der seriellen Schnittstelle gelesen. Falsch!!
    'Auch falsch in der Beschreibung:
    '... wenn kein Zeichen in der seriellen Schnittstelle ist.
    'In diesem Fall wird der Wert 256 (0x100) zurückgegeben.
    'Ein Byte kann niemals den Wert 256 annehmen
    'Realität:
    'Funktion liefert Integer
    'Dies hat natürlich für die weitere Bearbeitung heftige Konsequenzen
    'und ist sehr ungünstig
    'warum endet der Buffer nicht mit CR oder 0 , wie das sonst so
    'üblich ist.
    If sz <> 13 Then   'CR unterdrücken
Daten_Buffer(Buffer_Index) = sz 'Byte in Array übergeben
If sz=&H100 Then
Exit    'bei 0x100 ist der Puffer leer
Else
Command = Daten_Buffer(Buffer_Index) 'Daten werden zugeordnet
Serial_Write(0,Command) ' und zu Prüfzwecken wieder ausgegeben
            'hier kommt mal die Ã?bergabe des Daten_Buffer in einen String
            'und am Ende der Sub die Auswertung in einer anderen SUB
            'um die Interruptroutine nicht zu lang werden zulassen
            'auch wenn der Interupt nicht klappt
            End If
End If
End While
'Auswertung(Auswertestring)       'noch nicht programmiert
End If
    Serial_Write(0,CR)                       ' CR und LF ausgeben
    Serial_Write(0,LF)

End Sub



    Antwort schreiben


Antworten: