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: ;!!!
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: ;!!!