PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Übertragungsfehler bei Rs232 Verbindung



Static
17.09.2005, 01:02
Nabend,
ich schicke mit einem Delphi Programm größere Datenmengen an meinen Mega32, den ich mit Bascom programmiert habe und der die Zahlen mit dem Input() Befehl engegen nimmt.
Dabei kommt es öfters zu Übertragungsfehlern (anscheind je länger das Gerät in Betrieb ist, desto häufiger). Die Daten bestehen aus mehreren 4 stelligen Integer Zahlen. Bei Übertragungsfehlern werden dann manchmal ein oder zwei Stellen gar nicht übertragen, wo dran kann das liegen?
Ich habe es mit einer Übertragungsgeschwindigkeit von 9600 Baud und 19200 Baud probiert, aber ohne Unterschiede.
Kann das an meinem Usb -> Rs232 konverter liegen, oder ist sowas "normal"?
Wie kann ich diese Übertragungsfehler verhindern, ohne alles doppelt und dreifach übertragen zu müssen?
Wär toll wenn mir da jemand einen Tipp geben könnte, danke

linux_80
17.09.2005, 01:10
Moin,
was macht der M32 sonst so in der Zeit,
evtl. hält ihn etwas ab vom Zeichen empfangen ?
Irgendwelche Interrupts aktiv ?

17.09.2005, 01:22
hmmm, ich hab einen Servo angeschlossen der ja mit einem PWM Signal angesteuert wird. Da wird doch auch ein Interrupt benutzt, das wär natürlich übel

Static
17.09.2005, 01:25
man, das war natürlich von mir. Werd nachher dann mal ausprobieren, ob das was ändert wenn ich den weg nehme.
Wenn Servo und Uart sich blockieren könnte natürlich auch erklären, warum der Servo manchmal so leichte zuckungen hat.

Torsten_G
17.09.2005, 02:06
Hallo Static,

ich wäre sehr an Deinem Quellcode interessiert, weil ich auch einen Versuch unternehmen wollte, einen Mega 8 mit Delphi über die RS232 anzusprechen.

Darf ich Dich bitten, Dein Delphi-Programm und den Bascom-Code mal hier zu posten? Das würde mir sicher zu einem leichteren Start verhelfen!

Besten Dank und viele Grüße

Torsten

Static
17.09.2005, 11:48
Ich hab mal alles aus meinem Delphi Programm rausgebaut, so das es im Prinzip nur noch ein kleines Terminal Programm ist (ich wollte nicht meinen ganzen Code posten, das ist mir zu peinlich, außerdem hätte er dir ja wahrscheinlich nicht viel genutzt)
Das Programm ist geschrieben mit Delphi 2005 und benötigt die ComPort Libary http://sourceforge.net/projects/comport/
um kompiliert werden zu können.
Wenn du es startest musst du zuerst auf den SetCom Button klicken und deinen Comport einstellen. Danach klickst du auf Open, womit der ComPort geöffnet wird.
In dem Textfeld über Senden kann man dann etwas eingeben und dann auf Senden drücken, worauf hin die Eingabe über den Comport geschickt wird. Alle gesendeten und empfangenen Daten werden in dem großen Textfeld angezeigt.
Der Clear Button dient dazu das Textfeld zu leeren, da ich noch keine Möglichkeit gefunden habe (bzw. noch nicht lange genug gesucht habe) es hinzukriegen, dass das Feld automatisch weiter runter scrollt wenn es voll ist...

Das Bascom Programm würde dir glaub ich nicht viel nutzen. Das ist eigentlich ganz einfach. Man kann mit Input(var) eine Eingabe vom Rs232 lesen. Der µC wartet dann so lange bis etwas eingegeben wird und speichert dies dann in die Variable.

Ich hoffe ich konnte helfen

Torsten_G
19.09.2005, 12:52
Hallo Static,

vielen Dank, damit hast Du mir in jedem Fall weitergeholfen!

Viele Grüße

Torsten

Guy
19.09.2005, 17:01
Nabend,
ich schicke mit einem Delphi Programm größere Datenmengen an meinen Mega32, den ich mit Bascom programmiert habe und der die Zahlen mit dem Input() Befehl engegen nimmt.
Dabei kommt es öfters zu Übertragungsfehlern


Ich würde mal sagen du müßtest da eine Flussteuerung "wie man das auf Deutsch nennt " einbauen. Also Xon/Xoff oder per Hardware.

Wenn dein Programm in einer Interruptroutine springt, muss du dem PC mit Xoff sagen, daß er keine Daten senden soll weil der Empfänger nicht bereit ist. Das mußt Du auch immer machen wenn der Buffer voll ist.


Ich weis nicht wie das in Bascom zu machen ist, kenne mich da nicht so aus.


Edit:
Wenn nicht versuche mit der bautrate weiter runter zugehen. So hat der Controller mehr Zeit .

pebisoft
19.09.2005, 17:26
hallo ich habe so etwas ähnliches auch mal ausprobiert:

$regfile = "m16def.dat"
$crystal = 8000000
$baud = 19200

Dim I As Byte

Do
If Usr.rxc = 1 Then
I = Udr
Select Case I
Case "H"
Print "Hallo AVR"
Case "h"
Print "hallo avr"
Case Else
Print "Unbekannter Befehl"
End Select
End If
Loop
End

damit kannste denn auch strings einlesen, während andere dinge gemacht werden, natürlich in einer interupptroutine.
mfg pebisoft

Static
20.09.2005, 17:47
vielen Dank für eure Tips, ich werd dann mal versuchen eine anständige Flussteuerung ein zu bauen.

Static
14.10.2005, 18:07
so, also es lag tatsächlich am Servo. Hatte ihn erstmal abgeklemmt und seitdem funktionierte eigentlich alles. Ich hab jetzt auch Xon/Xoff per Software eingebaut, bloß wie benutze ich das jetzt...
Kann ich irgendwie in den Timer vom Servo Signal, dazu schreiben, dass er bevor er da hin springt Xoff sendet und wenn er wieder kommt wieder Xon macht?

pebisoft
14.10.2005, 21:33
das ist eine krankheit von bascom. wenn du noch weiter solchen ähnlichen zeitkritischen routinen einbauen tust wird es immer mehr mit den ausfällen der daten bis zum programmwirrwarr. nimm dafür winavr-c oder fastavr-basic , da passiert so etwas garantiert nicht. ich habe z.b. an meinem küchenbrettroboter 2 servo mit srf04 für datentransfer über max zum palm m105, 1 interrupt für rc5, 1 interrupt für adc mit 2 radencoder, 1 interrupt für softwareuart und alles läuft wunderbar mit fastavr-basic.
man glaubt mir hier nicht, diese schlappe habe ich vor einpaar wochen schon einmal kommen sehen, wo ich gesagt habe, wenn man mit bascom ins eingemachte geht, macht es die grätsche.
mfg pebisoft

15.10.2005, 12:14
da muss ich dir recht geben, für so große Sachen scheint mir Bascom wirklich nicht geeignet und ich habe mir auch schon mehrfach geschworen, dass das mein letztes Programm in Bascom war.
Aber jetzt nochmal alles von vorne machen und in C übersetzen habe ich auch keine Lust.