Re: RS232 Kategorie: Programmierung Basic (von erzgebirgler47 - 18.02.2010 17:39) | ||
Als Antwort auf Re: RS232 von PeterS - 18.02.2010 11:17 | ||
| ||
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: |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum