PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Großes Problem mit RS232 beim Datenaustausch mit PC



04.09.2004, 22:02
Hi!!!

Ich hab ein Rissengrosses Problem, was hoffentlich ganz einfach zu lösen ist!!!
Seit über 3 Wochen suche ich im Netz nach Hilfe und finde keine.

Ich habe mir das Lehrbuch AVR Mikrocontroller gekauft. Außerdem programmiere ich mit Bascom den Atmega8 und benutze das Programm AvrTerm!
Dazu kommt das ich in Visual Basic.net programmiere.

Mein Problem:
Ich habe mir ein kleines Windows Programm mit VB.net geschrieben was einen String über den Seriellen Com-Port (Com1) versenden kann.
Für meinen Atmega8, auf der Übungsplatine vom Lehrbuch, habe ich ein Programm geschrieben was über den Com1 Daten empfängt und auf einem 20x4 Zeilen Display ausgibt. Das funktioniert alles, also z.b. im PC „Hallo Welt“ ins Programm schreiben und abschicken. Danach taucht „Hallo Welt“ auf dem Display auf!!! Bis hierher noch kein Problem. Aber, wenn ich im Atmega8 ein Programm schreibe was dauernd „Hallo Welt“ in den Sendepuffer schreibt und ich das im Windows Programm empfangen will habe ich ständig nur Fragmente. Ich habe durch meine suche erfahren das das normal ist. Man muss den Com1 ständig abfragen und möglichst Spezielle Bytes einfügen damit man weis wo die gesendeten Daten anfangen. Also z.b. der Atmega8 sendet nonstop „#BEGIN#Hallo Welt#END#“ das PC-Programm Empfängt dann z.b. „allo Welt#END##BEGIN#Hallo Welt#END##BEGIN#Hallo Welt#END#“
Das Programm kann dann ohne Probleme den eigentlichen String herausfiltern „Hallo Welt“ und ein „OK“ zurücksenden auf das der Atmega8 wartet und nun den nächsten String sendet bis erneut ein „OK“ als Bestätigung kommt.
Das klingt alles ganz logisch und funktioniert auch theoretisch aber scheinbar nicht praktisch. Weil das Windows Programm nicht immer ein Byte was vom Atmega8 gesendet wurde auch so empfängt. Damit meine ich nicht Störsignale oder so sondern das wen der Atmega8 den String „AB“ sendet, muss er „0100000101000010“ senden 01000001=A und 01000010=B. Das Windows Programm fängt aber scheinbar nicht vorn am ersten Bit für ein Byte an sondern manchmal irgendwo mitten drin an das erste Bit für ein Byte zu lesen. Also z.b. original gesendet: „0100000101000010“ und Angefangen mit Empfangen des ersten Byte ab dem vierten Bit „0000101000010…“. Logischerweise kommt dann nur mist heraus!!!
Dieser Fehler ist auch ganz einfach nachvollziehbar, indem man das Programm 0404 aus dem Buch:

'0404.BAS: UART: Senden mit Warteschlange
'Hardware: MAX232 an PD0/PD1, Nullmodemkabel zum PC
' Speaker an Pin PD5
'----------------------------------------------------------
$regfile = "m8def.dat" 'ATmega8-Deklarationen
$crystal = 3686400 'Quarz: 3,6864 MHz
$baud = 9600 'UART: 9600 Baud

Config Serialout = Buffered , Size = 20 '20 Bytes Warteschlange

Ddrd.5 = 1 'PD5 als Ausgang konfigurieren

Do
If _rs_head_ptrw0 = _rs_tail_ptrw0 Then 'Sendepuffer leer?
Print "Das ist ein Test."
End If
Portd.5 = Not Portd.5 'PD5 (Speakerausgang) invertieren
Waitms 1 'Eine Millisekunde warten
Loop
End
'[Listing zum AVR-Mikrocontroller-Lehrbuch von Roland Walter, www.rowalt.de]

in den Atmega8 steckt und das Programm AvrTerm startet. Wenn man dann Com1 connectet, kommt normalerweise:

ist ein Test. Das ist ein Test. Das ist ein Test. Das ist ein Test. Das ist ein Test.
Das ist ein Test. Das ist ein Test. Das ist ein Test. Das ist ein Test. Das ist ein u.s.w.

Wenn man aber mehrere male auf connect klickt kommt es ab und zu mal vor das man nur mist empfängt:

Ӕʎố̕|ĉĉÍÝ“↨§ÇӔç=øﲎ♥}谎ȹNJӔʎố̕|ĉĉÍÝ“↨§ÇӔç=øﲎ♥}谎ȹNJӔʎố̕ |ĉĉÍÝ“↨§ÇӔç=ø
ﲎ♥}谎ȹNJӔʎố̕|ĉĉÍÝ“↨§ÇӔç=øﲎ♥}谎ȹNJӔʎố̕|ĉĉÍÝ“↨§ÇӔç=øﲎ♥}谎 ȹNJӔʎố̕|ĉĉÍÝ“↨ u.s.w.

So und nun hätte ich gern Hilfe von euch da draußen bekommen :D weil mir das nix nützt wenn der laufend mal nur schei… empfängt.
Das PC-Programm muss doch unbedingt wissen wo ein Byte anfängt und wo eins aufhört!!! Ich habe die üblichen Einstellungen benutzt:
Com1:9600,8,N,1
Auf der Übungsplatine werden nur Pin 2;3;5;7;8 benutzt für was die anderen Pins sind die nicht angeschlossen sind weis ich nicht.
Ich Vermute das auf einen dieser Pins ein Signal gesetzt ist was dem PC sagt das jetzt ein neues Byte anfängt, ist aber nur eine Vermutung!

Könnt ihr mir bitte helfen wenn man ein Modem an den PC anschließt und ins Internet geht sendet das Modem eine menge Daten zum PC die er auch richtig empfangen muss, wie machen die das???
Ich kann in VB.net aber nicht das MScomm.ocx benutzen weil’s das nicht mehr gibt!!! (läuft aus) Ich mache also alles über API’s wie auf http://support.microsoft.com/default.aspx?scid=kb;en-us;823179&Product=vb6 beschrieben ist!!!
Helft mir bitte ich suche nun schon über 3 Wochen und verzweifle nun :cry: ;!!!

Robotik
04.09.2004, 22:05
Hab vergessen mich einzuloggen!!! Der Beitrag is von mir!!!

avatar
04.09.2004, 22:50
Das gleiche Problem hatten wir vor kurzem schon mal.

Fehlerursache war ein falsch gesetztes FUSE-Bit. Dadurch wurde der ATMEL nicht mit den angeschlossenen Quarz getaktet sondern mit dem internen RC-Generator. Die Baudrate stimmt dann nicht genau und die Daten, die der ATMEL sendet können nur verstümmelt empfangen werden.

04.09.2004, 23:07
Die FUSE-Bits Stimmen alle so wie sie laut Buch sein müssen damit der Externe Quarz benutzt wird.

recycle
05.09.2004, 06:04
Die FUSE-Bits Stimmen alle so wie sie laut Buch sein müssen damit der Externe Quarz benutzt wird.

Hast du mal mit einem normalen Terminal-Programm, z.B. dem das in Bascom enthalten ist überprüft ob da auch nur Unsinn ankommt?
Dann wüsstest du wenigstens schon mal ob es an deiner Hardware, am Programm im µC oder an dem VB-Programm liegt.

(sorry, falls die Frage schon irgendwo in deinem Text beantwortet ist, der war mir ehrlich gesagt zu lang um ihn komplett durchzulesen)




Ӕʎố̕|ĉĉÍÝ“↨§ÇӔç=øﲎ♥}谎ȹNJӔʎố̕|ĉĉÍÝ“↨§ÇӔç=øﲎ♥}谎ȹNJӔʎố̕ |ĉĉÍÝ“↨§ÇӔç=ø
ﲎ♥}谎ȹNJӔʎố̕|ĉĉÍÝ“↨§ÇӔç=øﲎ♥}谎ȹNJӔʎố̕|ĉĉÍÝ“↨§ÇӔç=øﲎ♥}谎 ȹNJӔʎố̕|ĉĉÍÝ“↨ u.s.w.


So ähnlich sieht es auch aus, wenn man Ascii Zeichen sendet und in VB als Bytes einliest.

05.09.2004, 10:46
Die Frage wurde beantwortet! Ich habe denn obigen Code benutzt und das AvrTerm Programm.
Das Programm empfängt die Daten und je nachdem wann ich auf connect klicke empfängt er das richtige oder nur mist.

Bitte den Text komplett lesen, auch wenn es viel ist! Ich habe extra etwas mehr geschrieben um den Fehler einzugrenzen.

focobot
07.09.2004, 08:09
Hallo,
probier doch mal mit einem Protokoll zu arbeiten, was richtige Messages erstellt z.B. S.N.A.P..
Ich habe schon diverse Tests gemacht und es funktioniert prächtig, ausserdem kannst Du auf der Homepage des Entwicklers eine *.dll herunterladen die Du in VB nutzen kannst.

Robotik
07.09.2004, 22:27
Hi,
wo soll auf der Seite ne dll zum Dounloaden sein???
Ich finde die nicht auf www.atmel.com.

sonic
08.09.2004, 02:22
Hast du's schon mal mit dem einfachen "Print"-Befehl probiert?
Die Interruptgesteuerte UART will bei mir auch nicht wirklich funktionieren.
Ansonsten frage ich in VB über das OnComEvent ab, das tritt ja auf sobald eine Zeichenkette empfangen wurde und zur Verfügung steht...

Gruß, Sonic

Robotik
08.09.2004, 20:50
Ich habe den Fehler gefunden!!! Der Fehler liegt in Bascom!!!
Wenn man Open benutzt, wird die Uart richtig gesetzt (8N1).
Wenn man $Baud benutzt wird die Uart falsch gesetzt oder nicht richtig (8N0) was zu diesen Fehlern führt wie oben beschrieben.
Ich habe mir das Datasheet zur Hand genommen und habe alles manuell gesetzt per Register!!! Und jetzt funktionierts ohne Probleme wie ich es will :-)
Die DLL für VB würde mich allerdings interesieren, wenn jemand weis wo der Download ist soll er es mir Bitte sagen!!!

Cyo

Frank
08.09.2004, 21:09
Kann ich aber nicht so recht bestätigen, zumindest beim Mega 16 hatte ich da keine Probleme bei Bascom. Ich hab auch schon den Hardware Uart und gleichzeitig eine Software rs232 mit open geöffnet. Ging problemlos. Vielleicht hast du ältere Bascom Version oder aber es betrifft wirklich nur Mega 8.

Günter49
08.09.2004, 22:36
Ich weiß zwar nicht, welche .dll focobot meint, aber wenn es nur um eine .dll geht, mit der von VB.Net über RS232 kommunizieren kann, ist vielleicht IO.DLL eine Lösung.
Auf der Beschreibungs- und Download-Seite: http://www.geekhideout.com/iodll.shtml
sind auch die für VisualBasic nötigen Deklarationen genannt.
(Schon mal gepostet am 30.8 in einem anderen thread)

Günter

focobot
10.09.2004, 02:45
Es geht um eine *.dll die über die Com vom PC das S.N.A.P. - Protokoll nutzen kann. Das wäre vor allem interesant wenn man mehrere Teinehmer am Bus hat, weil die Nodes über Addressen angesprochen werden.
Der Entwickler von S.N.A.P. ist www.hth.com/snap.
Ich bin mit meinem Zeug leider noch nicht ganz soweit,sodass ich noch keinen Code reinstellen kann.