Hallo! Ich habe folgendes Problem. Ich habe eine MSP430 Platine mit einer Externen Gerätschaft verbunden. Diese externe Gerätschaft schaufelt in periodischen Abständen ca. 2000 Byte bei 115200 Baud über die RS232 Schnittstelle raus. Diese Daten solle jetzt einfach empfangen werden und auf die 2e USART Schnittstelle meiner MSP430 Platine durchgereicht werden. so weit so gut ... vom Prinzip her funktioniert das ganze auch ... jedoch habe ich das Problem dass nicht alle Daten auch hinten ankommen, der MSP430 sozusagen einfach Daten verschluckt. Handshakeleitungen sind nicht vorhanden ... :( Ich habe schon in meiner ISR einen Counter vorgesehen , welcher bei jedem Empfangenen Zeichen auf einen bestimmten Wert gesetz wird ( z.B 2) dieser counter wird in einem Timer einfach runtergezählt ... wird für eine gewisse Zeit kein neues Zeichen empfangen(counter auf Null) , so findet eine Ausgabe des gesamten Empfangsbuffers statt. (Zusatzabfragekriterium ... neue Daten empfangen! ) Eigentlich sollte das so funktionieren ... sollte ;O) Das Problem dabei sind einfach die großen Datenmengen ... bei kleineren Datenmengen bis ca 200 Byte funzt es einwandtfrei ... die entsprechenden Buffer sind auch groß genug ausgelegt ... (RAM des MSP430 10 kByte). Habt ihr da vielleicht eine Idee wie ich solch großen Datenmenge handlen kann ... Im Anhang noch der Quellcode für die USART Routinen und die Abfrage evtl. emfangener Daten. mfG der Verwickler
Beide Interfaces haben nur nominell die gleiche Geschwindigkeit. Kannst du sicherstellen, dass es keinen Bufferover bzw. underflow gibt? Deine Beschreibung deutet nämlich darauf hin.
Hört sich fuer mich auch so an. Fragen: -Globale Variablen 'volatile'???? Warum ist 'TXBUF0 = RXBUF1;' auskommentiert??? Funktioniert es denn wenn du in der ISR nur diese Zeile hast? Das wuerde bewirken, dass die empfangenen Daten sofort wieder rausgehen, allerdings musst du beim Senden der einzelnen Bytes nen kleinen Delay einbauen um dem "Durchschleuss MSP" die moeglichkeit zu geben die ISR sauber und ohne Timing Probleme abzuarbeiten. Sollte das Funktionieren liegts an deinem Programm und nicht am MSP. Tipp: schon mal ueber die Verwendung eines Ringpuffers nachgedacht??? Herr Fleury (in diesem Forum schon oefters erwaehnt) hat da ne schoene Library fuer AVR, die du portieren koenntest. mfg Alex
Man kann hier nicht einfach vom RXbuffer eines UARTS lesen und direkt in den TX Burffer des zweiten UARTS schreiben. Warum? Weil wie bereits gesagt die Datenraten nicht exakt identisch sind. Beispiel. RS232 kann problemlos mit 1% Baudratenfehler arbeiten. Nehmen wir an, deine Datenquelle arbeitet mit +1% Fehler, dein MSP mit 0% Fehler. D.h. aber dass nach 100 vom MSP weitergereichten Zeichen deine Quelle schon 101 gesendet hat. Wo bleibt das eine Zeichen? Wenns richtig gemacht wird im Softwarepuffer. Also muss der RX Interrupt die Daten in einen kleinen Softwarepuffer schreiben (FIFO) und der TX Interrupt sie daraus lesen. MFG Falk
Genau das wird das Problem sein. Die Quelle schuettet Dich mit Daten mit größerer Baudrate (durch die Toleranz) zu, als das Du diese wegschaffen kannst. Da führt kein Weg an einem Ringpuffer vorbei. Aber es muss natuerlich nach den 2000 Bytes genug Zeit sein, die "überschüssigen" Bytes noch zu senden, bevor das nächste Paket eintrifft. Kann man ja mal nachrechnen, RS232 funktioniert meines Wissens bis +/-5%. Ich versuchs mal: Bei 115200, +5% Toleranze beim Senden sind die 2000 Bytes nach 165ms beim MSP angekommen. Dein MSP hat nehmen wir mal worst case an -5% (aber da Du ja einen Quarz verwendest, ist das rein theoretisch), macht beim Senden der 2000 Bytes 182ms. Du brauchst also mindestens 17ms zwischen den Paketen Pause,um überhaupt eine Chance zu haben. Nichtsdestotrotz, Ringpuffer-rules.
@ S. Z. (szimmi) >RS232 funktioniert meines Wissens bis +/-5%. RS232 Theoretisch bis +/-3%, real sollte man kleiner 1% nutzen. MFG Falk
Hallo Leute ! Es funktioniert ... ich habe ein wenig an der Baudratenmodulation "rumgedreht" und den Empfangsbuffer geringfügig größer gemacht ... hatte mich da möglicherweise um ein paar Byte verzählt ;) In jedem Fall werden jetzt alle 2000 Byte fehlerfrei rübergewuppt :) Danke auf jeden Fall für die Vorschläge und Anregungen ... der Verwickler
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.