PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Problem bei UART Kommunikation zwischen ATmega und VB.net



masasibe
09.09.2011, 13:08
Hallo allerseits!
Für ein Projekt muss ich mit VB mit einem ATmega über die UART Schnittstelle kommunizieren. Ich verwende Visual Basic 2008 und für die UART-Kommunikation verwende ich das Serial Port-Steuerelement.
Der Code auf dem ATmega schaltet eine Statusled ein bzw. aus, wenn der String "aus" bzw. an" empfangen wurde. Mit dem Hyperterminal und dem ATmega hat das auch ohne Probleme sofort funktioniert, aber wenn ich das ganze mit VB versuche dann funktioniert es nur bei der ersten Übertragung und dann nicht mehr. Erst sobald der ATmega resettet wird funktioniert es mit VB wieder genau einmal und dann nicht mehr.
Übrigens verwende ich einen ATmega32.
Da es mit dem Hyperterminal funktioniert hat, glaube ich nicht, dass es an der Kabelverbindung liegt. Die Baudrate habe ich auch schon überprüft und die sollte stimmen.



Hier mein VB Code:

PublicClass Form1
PrivateSub cmdffnen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdffnen.Click
If SerialPort1.IsOpen = FalseThen
SerialPort1.Open()
EndIf
EndSub
PrivateSub cmdSchlieen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSchlieen.Click
SerialPort1.Close()
EndSub
PrivateSub cmdan_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdan.Click
SerialPort1.WriteLine("an" & vbCrLf)
EndSub
PrivateSub cmdaus_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdaus.Click
SerialPort1.WriteLine("aus" & vbCrLf)
EndSub
PrivateSub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Dim x AsString
x = SerialPort1.ReadLine.ToString
MsgBox(x)
EndSub
EndClass


Und hier der Bascom-Code für den ATmega:

$regfile "m32def.dat"
$crystal = 1000000
$baud = 1200
Config Portd.5 = Output
Statusled Alias Portd.5
Statusled = 1
Dim X As String * 10
Do
Input X
If X = "an" Then
Statusled = 1
Elseif X = "aus" Then
Statusled = 0
End If

Loop

BMS
09.09.2011, 13:23
Hallo,
kenne mich zwar nicht direkt mit Bascom aus, aber welche Länge hat denn die Zeichenkette X ? Also wie lange wartet der Prozessor bei Input X ?
Wird das über Dim X As String * 10 festgelegt?

Oder machen die Steuerzeichen die du mitsendest (vbCrLf) Probleme?
Grüße,
Bernhard

Kampi
09.09.2011, 13:25
Ich bin mir nicht sicher aber in C kann man Strings nicht einfach mit

X = "aus"

vergleichen. Möglicherweise liegt es daran......
Mit Dim X as String * 10 legst du fest das X ein String ist der 10 Zeichen lang ist. Und wenn du dann schreibst:

Input X

wird alles was über den UART reinkommt in X reingeschrieben.

Wsk8
09.09.2011, 13:58
Meine Bascom-Kenntnisse sind schon etwas eingerostet, also nicht wundern wenn etwas falsch ist^^

Ich würde das so machen.


Dim X as String = "0"

Do
Input X
If X <> "0"
Call LED()
End if
loop

Sub LED()
If X = "an" Then Statusled = 1 Elseif X = "aus" Then Statusled = 0 End If
X = "0"
End Sub
mfg

Richard
09.09.2011, 14:12
Hallo,
kenne mich zwar nicht direkt mit Bascom aus, aber welche Länge hat denn die Zeichenkette X ? Also wie lange wartet der Prozessor bei Input X ?
Wird das über Dim X As String * 10 festgelegt?

Oder machen die Steuerzeichen die du mitsendest (vbCrLf) Probleme?
Grüße,
Bernhard

Input wartet auf das CR (Return) das LF (Linie Feed) ist input egal und das String Ende wird durch eine NULL gekennzeichnet. Ob das VbCrLf zusammen gesendet stört? Im Bascom Programm ist Dim X As String * 10 schon richtig.

Gruß Richard

Searcher
09.09.2011, 14:28
ich vermute auch, daß das LF am Schluß Probleme bringt. Schau mal den CONFIG INPUT Befehl an. Dort kann man festlegen, welche/s Zeichen INPUT beendet. Default ist nur CR.

Gruß
Searcher

masasibe
09.09.2011, 14:36
Hallo Wsk8!
Ich habe deinen Code eingebaut und ausprobiert, aber es hat leider trotzdem nicht funktioniert.


Input wartet auf das CR (Return) das LF (Linie Feed) ist input egal und das String Ende wird durch eine NULL gekennzeichnet.
Hallo Richard!
In VB habe ich jetzt das vbCrLf durch vbCr ersetzt und auch das hat nicht geholfen. Muss ich das mit der Null am Ende des Strings noch einbauen?

Das komische an der ganzen Sache ist ja, dass es immer das erste Mal funktioniert. Also wenn ich den ATmega einschalte und dann den "aus"-Button
drücke, dann geht die Led aus nur dann geht sie nicht mehr an. Also irgendwie funktioniert die erste Übertragung, aber alle weiteren nicht mehr.

Kampi
09.09.2011, 14:39
Du musst den String auch immer leeren.
Weil sonst kommt bei der ersten Übertragung ein "Aus" da rein und das steht dann da drin. Dann kommt die Abfrage und bei einer zweiten Übertragung kommt noch ein "Aus" oder "An" da rein und dann steht "AusAn" oder "AusAus" in dem String.

Searcher
09.09.2011, 14:52
In VB bin ich nicht so fit. Könnte es sein, das beim Senden die "SerialPort1.WriteLine" schon von sich aus ein CRLF anhängt und mit dem & vbCrLf noch weitere angehangen werden? Gibt es ein "SerialPort1.Write"?

Gruß
Searcher

masasibe
09.09.2011, 15:04
Hallo Searcher!
Kurz bevor ich deinen Beitrag gelesen habe, hatte ich die gleich Idee und es hat wirklich funktioniert.
Wenn ich schreibe SerialPort1.write("an" & vbcr) dann klappt es ohne Probleme.

Nur komisch, dass es mit SerialPort1.writeline("an") nicht funktioniert. Das habe ich nämlich ganz am Anfang geschrieben
und das hat überhaupt nicht funktioniert. Aber vielleicht liegt es wirklich am LF das gesendet wird.

Aber Hauptsache es funktioniert jetzt mit SerialPort1.write!

Vielen Dank für eure Hilfe!

Richard
09.09.2011, 16:31
Hallo Wsk8!
Ich habe deinen Code eingebaut und ausprobiert, aber es hat leider trotzdem nicht funktioniert.


Hallo Richard!
In VB habe ich jetzt das vbCrLf durch vbCr ersetzt und auch das hat nicht geholfen. Muss ich das mit der Null am Ende des Strings noch einbauen?

Das komische an der ganzen Sache ist ja, dass es immer das erste Mal funktioniert. Also wenn ich den ATmega einschalte und dann den "aus"-Button
drücke, dann geht die Led aus nur dann geht sie nicht mehr an. Also irgendwie funktioniert die erste Übertragung, aber alle weiteren nicht mehr.

Das habe ich schon begriffen, versuche einmal nur CR ohne VB, VB ist kein RS232 "genormtes" Steuerzeichen. Ansonsten kann ich Hterm empfehlen, um zu sehen was Dein VB Programm wirklich sendet Hterm zeigt in Hex,Bin,ASCII an was empfangen wurde. Ich vermute das deine Schleife hängt und deshalb nur 1 Durchlauf statt findet. Im Bascom Simutator kann man auch mittels Terminal b.z.w. Dein VB Programm austesten an welcher Stelle (Zeile) das Programm "Stoppt". Dazu muss aber im Header ein $sim eingefügt und neu Compiliert werden, (nicht vergessen das rückgängig zu machen für den normalen Betrieb).

Gruß Richard

Richard
09.09.2011, 20:07
Schaue Dir auch einmal bascoms instr an, damit kann man in einem String geziehlt nach z.B. "Ein" suchen. Die Funktion gibt war b.z.w. Unwar zurück.
Außerdem ist Input nicht gerade praktisch weil das solange den µC blockiert bis ein CD ankommt. :-(

Gruß Richard

Kampi
09.09.2011, 21:58
Ich würde das Input in die Recieve ISR vom UART packen. Dadurch wird nur was eingelesen wenn der Controller was empfängt und du blockierst ihn nicht durch das ewige warten auf eine Eingabe.

masasibe
10.09.2011, 17:52
Damit der ATmega nicht dauernd blockiert verwende ich immer diesen Code:

if ischarwaiting = 1 then
input x
end if



Richard: Das habe ich schon begriffen, versuche einmal nur CR ohne VB, VB ist kein RS232 "genormtes" Steuerzeichen.
Aber muss man nicht, wenn man in VB das CR senden möchte vbCr eingeben. Jedenfalls habe ich mit Cr eine
Fehlermeldung bekommen.

Richard
10.09.2011, 18:32
Aber muss man nicht, wenn man in VB das CR senden möchte vbCr eingeben. Jedenfalls habe ich mit Cr eine
Fehlermeldung bekommen.

CR ist nur ein Kunstwort und steht für HEX 13, wie das bei VB jetzt genau ist? CHR$(13)? Deshalb habe ich Hterm empfohlen, um sehen zu können was VB so sendet.

Gruß Richard

masasibe
10.09.2011, 18:41
Ah ich verstehe!
Hterm habe ich mir schon heruntergeladen. Jetzt habe ich nur das Problem, dass mein Computer, den ich zum Flashen verwende gerade Windows Updates installiert und deshalb nicht einsatzbereit ist. Die Installation dauert leider schon Ewigkeiten. Aber wenn ich den Computer wieder verwenden kann, dann werde ich es ausprobieren.