PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RS232 daten empfangen, senden und auswerten



Crischan
26.02.2009, 19:42
Hallo

Ich suche ein weg den Rs232 auszulesen und weiter zuverarbeiten, möchte aber auch daten senden bzw befehle ausgeben,

Ich arbeite mit dem RN-Control und RN-Schrittmotorsteuerung, beide sind über den I2C-Bus verbunden

Nun möchte ich mir eine art Terminal Programm schreiben.
Die Daten die ich empfange, möchte ich dann später Grafisch in echtzeit darstellen.

Die daten die ich senden möchte, sollen aus einer .txt ausgelesen werden und zum RN-Control Board über RS232 gesendet werden.

Wie und mit welcher Programmiersprache kann ich das am einfachsten bewerkstelligen?
Hat einer sowas ähnliches schon einmal gemacht?

Meine bisherigen Programmier kenntnisse sind Turbo Pascal (vor c.a. 6 Jahren), PHP, Html und Lite-c (3dgs Gamestudio).
Ich bin für alles offen und bin auch bereit etwas neues zulernen.

Macht mir bitte ein paar vorschläge wie ich das angehen muss.

Vielen dank im vorraus :)

Neutro
26.02.2009, 19:54
Hier ist ein WIKI das für den Einstieg gut geeignet ist:
https://www.roboternetz.de/wissen/index.php/Windows_Programm_zum_Steuern_des_AVR%27s

Das hat zwar nichts mit grafischer Ausgabe zu tun aber man
kann sehen wie die Kommunikation funktioniert.

Gruß

Neutro

Crischan
26.02.2009, 20:00
Danke für dein fixe antwort

Das sieht schon verdamt gut aus :) ich werde mir das mal genauer anschauen.

Ich nehme aber immer noch gerne vorschläge an.

Volly42
27.02.2009, 11:36
Hallo.

Ich weiss nicht genau, ob dies ist was Du suchst. Ich wollte mal die Analogdaten graphisch in einem Programm darstellen. Die Daten werden als Datenfeld ausgelesen, dies passiert mit einer Updaterate von ca. 21 ms. Der Atmega schickt nach Aufforderung dann die Datenpakete rüber.

Die PC Programmierung ist allerdings auf Linux mit GTK programmiert, wenn es interessiert kann ich den Code gerne schicken. GTK ist auch für Windows verfügbar, allerdings muss die serielle Schnittstelle angepaßt werden, auch muss die GTKDatabox auch noch kompiliert werden.

Gruss
Volly

Crischan
27.02.2009, 15:42
Hi,

joa so ähnlich nur halt nicht als diagram sondern sollen variablen im String oder als text ausgegeben werden.
Sowas wie gefahrener weg der einzelnen Motoren oder ausgaben von sensoren

Volly42
27.02.2009, 18:48
Hallo.

Also so richtig klar ist mir immer noch nicht, was Du willst. Ich habe mal einfach einen Kommandointerpreter auf den Atmega geschoben. Der reagiert nun auf die Eingabe vom Terminal (unter Windows Hyperterminal). Ausgabe siehst Du unten. Die einfachen Terminalprogramme können auch Dateien senden, in diesem Fall wären dies die Befehle und können auch die Ausgabe in eine Datei speichern. Für das alles brauchst Du Dir kein Terminal selbst zu schreiben. Die Textdaten kannst Du dann mit gnuplot einlesen und graphisch darstellen.

Gruss
Volly

Crischan
27.02.2009, 21:55
http://www.bilder-hochladen.net/files/6vsx-4.jpg (http://www.bilder-hochladen.net/files/6vsx-4-jpg-nb.html)

So in etwar hatte ich mir das ersteinmal vorgestellt

das mit der .txt ist erstmal nicht wichtig. als erstes will ich die variablen die mein RN-Control ausgibt ordendlich und sauber in echtzeit auszulesen sind.

Denn wenn ich die über ein Terminal ausgeben lasse ist es sehr schwer 4-5 zeilen aufeinmal im ms takt zulesen bzw zusehen

Volly42
27.02.2009, 22:32
Hallo.

Na die GUI ist ja schon erledigt, wenn ich mich nicht täusche hast Du wxWidget verwendet, dann brauchst Du ja nur noch die serielle Schnittstelle...

http://wxcode.sourceforge.net/showcomp.php?name=wxCtb

...und die Kiste ist fertig.

Gruss
Volly

Crischan
27.02.2009, 22:38
Ne
ich hab das von der wiki seite
https://www.roboternetz.de/wissen/index.php/Windows_Programm_zum_Steuern_des_AVR%27s

Crischan
27.02.2009, 23:47
Ich geh mal davon aus das folgene zeilen dafür zuständig sind den text vom com-port auszugeben


Sub Timer1Tick(sender As Object, e As EventArgs)
If serialport1.BytesToRead > 0 Then
Do
textbox1.AppendText (chr(SerialPort1.Readbyte))
textbox1.ScrollToCaret
If SerialPort1.BytesToRead = 0 Then
Exit Do
End If
Loop
end if

End Sub

wie kann ich das machen das in jeder textbox die ich hab eine bestimmte variable ausgegeben wird

Willa
28.02.2009, 13:14
Hi!
Das Tut im Wiki ist von mir. Um variablen in verschiedenen textboxes auszugeben musst du eine Art Marker verwenden. z.B. dein µC sendet:
A53
B129
C223
Die Buchstaben sagen um was für daten es sich grad handelt. z.B. A bedeutet dass es Temparaturdaten sind, B ist Motorstrom etc.

In deiner GUI liest du alle Daten per RS232 ein und guckst dann nach welche Daten es sind und teilst sie dann auf deine Textboxes auf.


readvar=SerialPort1.ReadLine
ContainsA = readvar.Contains("A") 'checkt ob ein "A" im String ist -> also temperatur
If ContainsA=true then 'wenn ein A drin ist
Temperaturwert=readvar.TrimStart("A") 'dann das A abschneiden
temperaturtextbox.text=temperaturwert 'Rest in die textbox schreiben
end if


So ungefähr sollte das gehen. Dieses Verfahren habe ich auch für meinen Tricopter verwendet, im Video siehst du wie die Software funktioniert:
http://www.villalachouette.de/william/krims/tricopter/Tri.wmv

Neutro
28.02.2009, 13:28
Hallo Willa,

kannst du noch etwas genauer beschreiben wo der von dir genannte Code
eingefügt werden muss? ich interssiere mich auch brennend für solche Anleitungen.

PS: Danke für die Erstellung des WIKI!!!

Willa
28.02.2009, 13:40
Okay, ich kanns gerne nochmal genauer erklären:
Der Serialport wird in einem Timer abgerufen (Interval z.B. 15ms)


Sub Timer1Tick(ByVal sender As Object, ByVal e As EventArgs)
if serialport1.BytesToRead > 0 then
Do
readvar=SerialPort1.ReadLine

ContainsA = readvar.Contains("A")
ContainsB = readvar.Contains("B")
ContainsC = readvar.Contains("C")

if ContainsA = true then
A_Daten=readvar.TrimStart("A")
Textbox1.text=A_Daten
end if

if ContainsB = true then
B_Daten=readvar.TrimStart("B")
Textbox2.text=B_Daten
end if

if ContainsC = true then
C_Daten=readvar.TrimStart("C")
Textbox3.text=C_Daten
end if

If SerialPort1.BytesToRead = 0 Then
Exit Do
end if

loop
end if
end sub

Ich glaube so sollte das klappen. Vorher müsst ihr natürlich die Variablen noch deklarieren und den Serialport öffnen (so wie im Wiki beschrieben).

Neutro
28.02.2009, 13:46
Da meine Kenntnisse in Sharp sehr begrenzt sind (alles was ich darüber weis
ist aus deinem WIKI) würdest du mir einen großen Gefallen damit erweisen
wenn du noch erklären könntest wo und wie man in Sharp Variablen deklariert. Ich kenne mich programmiertechnisch leider nur in Bascom aus.

Vielen Dank schon mal

Crischan
28.02.2009, 13:58
Hi, danke das du auf meine Mail reagiert hast

Das läuft jetzt so wie ich es in etwa haben wollte.
Im moment macht er mir noch ein merkwürdiges zeichen hinter der ausgabe,
son kästchen, weis da einer was?

Willa
28.02.2009, 13:59
Das geht ca. so wie in Bascom auch:
Dim ContainsA As Boolean
Dim readvar as string

Am besten direkt unter diese automatisch erzeugten Zeilen setzen:
public Sub New()
Me.InitializeComponent()
End Sub

Dann kann man auf die Variablen aus jeder Sub zugreifen.

Willa
28.02.2009, 14:02
@Christian:
Wie sieht denn dein Sendebefehl auf dem µC genau aus?

Crischan
28.02.2009, 14:06
hier mal mein code im SharpDevelop


Public Partial Class MainForm
Public Sub New()
' The Me.InitializeComponent call is required for Windows Forms designer support.
Me.InitializeComponent()
serialport1.open
'
' TODO : Add constructor code after InitializeComponents
'
End Sub

Sub Button1Click(sender As Object, e As EventArgs)
serialport1.Write (1)
End Sub

Sub Button2Click(sender As Object, e As EventArgs)
serialport1.Write (2)
End Sub

Sub Button3Click(sender As Object, e As EventArgs)
serialport1.Write (3)
End Sub

Sub Button4Click(sender As Object, e As EventArgs)
serialport1.Write ("r")
End Sub
Dim readvar As String
Dim ContainsA As Boolean
Dim ContainsB As Boolean
Dim Temperaturwert As String


Sub Timer1Tick(sender As Object, e As EventArgs)
If serialport1.BytesToRead > 0 Then
Do
readvar=SerialPort1.ReadLine
ContainsA = readvar.Contains("A")
ContainsB = readvar.Contains("B")'checkt ob ein "A" im String ist -> also temperatur
If ContainsA=true then 'wenn ein A drin ist
Temperaturwert=readvar.TrimStart("A") 'dann das A abschneiden
temperaturtextbox.text=temperaturwert 'Rest in die textbox schreiben
End If
If ContainsB=true then 'wenn ein A drin ist
Temperaturwert=readvar.TrimStart("B") 'dann das A abschneiden
temperaturtextbox2.text=temperaturwert 'Rest in die textbox schreiben
end if

If SerialPort1.BytesToRead = 0 Then
Exit Do
End If
Loop
End If



End Sub



Sub Label1Click(sender As Object, e As EventArgs)

End Sub

Sub Timer2Tick(sender As Object, e As EventArgs)

End Sub
End Class


hier mein AVR


Dim A As Byte

Do
A = Inkey()
If A > 0 Then
Select Case A
Case 49 'Das ist der ASCII Code für Taste "1"
Sound Portd.7 , 400 , 450
Print "ATaste 1 wurde gedrückt"
Case 50 'Das ist der ASCII Code für Taste "2"
Sound Portd.7 , 400 , 550
Print "BTaste 2 wurde gedrückt"
Case 51 'Das ist der ASCII Code für Taste "3"
Sound Portd.7 , 400 , 650
Print "Taste 3 wurde gedrückt"
Case 114 'Das ist der ASCII Code für Taste "r"
Print "Reset..."
Goto 0
End Select
End If
Loop

Willa
28.02.2009, 14:11
hmmm, ob mein Code bei strings wie "BTaste 2 wurde gedrückt" funktioniert weiss ich nicht....
Sende doch mal soetwas:
print "A" ; 123
print "B" ; 124

Crischan
28.02.2009, 14:14
Ist immer noch das kästchen hinter

Willa
28.02.2009, 14:20
Das ist bestimmt das CR/LF dingsbums (also das "Enter") was dein µC nach jeder Zeile sendet...
Probier mal das hier:
Temperaturwert=(Convert.ToInt16(readvar.TrimStart("A"))).toString

das konvertiert erst zu einem Integer und anschließend wieder in einen String.... Ist zwar eigentlich schwachsinnig, aber vielleicht ist VB ja so schlau und konvertiert das "Enter" nicht mit.....

Crischan
28.02.2009, 14:23
Jo, so läuft es :) dankr dir

Neutro
28.02.2009, 14:29
Ich danke dir auch Willa!
Werde mich mal heute abend wieder damit beschäftigen.

Gruß

Neutro

Crischan
28.02.2009, 16:05
Frage.

Ich hab jetzt die Schrittzahl in einer TextBox augegeben aber wenn die Schritte zugross werden meckert er das ich ein falschens format hab. Wie kann ich das mit As Long ausgeben?

Willa
28.02.2009, 16:09
wenn es tatsächlich daran liegt dass deine Werte größer als 32768 sind dann kannst du statt convert.toint16 auch convert.toint64 nutzen. Dann dürfen deine Werte bis 9223372036854775808 gehen.

Crischan
28.02.2009, 16:13
ah danke dir

habe ich eben auch gemerkt das, dass daran liegt, hatte es schon auf 32 geändert :)

Crischan
28.02.2009, 16:28
Was muss ich in ein


Sub TrackBar1Scroll(sender As Object, e As EventArgs)

End Sub

schreiben damit beim schieben eine Variable übergeben wird?

Gibt es eigentlich ein gutes Tutorial für SharpDevelop?

Willa
28.02.2009, 16:36
SharpDevelop ist nur die Entwicklungsumgebung. Wenn du Tutorials suchst, dann such nach VB.NET, das ist nämlich die Programmiersprache die du benutzt.
variable_zu_versenden=trackbar1.value
Das schreibt den aktuellen wert deiner trackbar in eine variable. Eigenschaften kann man immer mit nem punkt hinter dem Objekt auslesen und beschreiben. z.b. textbox1.text, textbox2.length, progressbar1.value und so weiter.....

Crischan
28.02.2009, 17:07
Eine frage noch :)

Ich sende jetzt 2 variaben zum AVR


serialport1.Write ("5,Speed")

die erste frag ich ja mit einer case ab, aber wie kann ich nach der zweiten variable fragen

Willa
28.02.2009, 17:14
du musst genauso machen wie bei den daten die du vom µc zu PC schickst. mit einem "Buchstaben" markieren. Und dann in Bascom wieder auseinanderfriemeln. Die Bascom Hilfe hilft, oder ein anderer Artikel im Wiki:
https://www.roboternetz.de/wissen/index.php/Joystick_am_PC_zur_Kontrolle_eines_Roboters#Update :_Verbesserter_Signal-Empfang
jetzt hab ich aber genug zeit in diesem thread verbracht...... :-D

Crischan
28.02.2009, 18:36
Ich nerve ja nur ungerne aber ich brauch nochmal deine hilfe

Ich bekomm das mit dem input nicht hin :(

Willa
28.02.2009, 18:46
Dann kommentiere deinen Code (VB und Bascom) so doll du kannst und schick ihn mir per mail.... (am besten die kompletten Projektdateien von Sharpdevelop). Ich guck mal ob ich da was machen kann.

Crischan
01.03.2009, 15:08
Aller Besten dank Willa. Dank deiner Hilfe hab Ich schon einiges hinbekommen, allerdings hab ich da noch ein kleines Problem :(

Und zwar
Ich brauch ein Unterprogramm, in Bascom, was einmal gestartet wird und von alleine weiterläuft ohne das andere loop warten bis das Unterprogramm beendet wird

Ich brauch noch eine dauer abfrage der schrittzahl, in Bascom und wenn ich das ins hauptprogramm schreibe wartet immer alles auf Input und ich bekomm erst eine ausgabe wenn ich ne taste drücke

Gibt es da lösungen zu? Mit google hab ich leider nix gefunden

Crischan
01.03.2009, 16:58
Ich frag mal anders.

Wie kann ich den Input befehl umgehen wenn er kein input bekommt?
Ich dachte mir das erst so


If (input "" , Inputstring) = 1 Then

aber das geht leider nicht

Gibt es da ein bestimmten befehl der das überprüfen kann ob der input was reinbekommt?

Bitte helft mir

Willa
01.03.2009, 17:54
guck mal im wiki bei dem tutorial für die joysticksteuerung. im Bascom beispiel ganz unten steht wie man den input-befehl aushebelt wenn nichts kommt.

Crischan
01.03.2009, 18:27
Danke dir habs hinbekommen
Allerdings scheinen jetzt die signale die ich zum AVR schicke nicht richtig anzukommen.
Ich hab ein Printbefehl der durchgehent sendet, kann das daran liegen?
Den printbefehl prauch ich allerdings was kann man da machen?

Willa
01.03.2009, 18:42
Das kommt auf die individuellen umstände an (z.b. wie schnell gesendet wird, wie du den code implementiert hast etc) Musst du selber rausbekommen woran es liegt indem du es ausprobierst....

Crischan
01.03.2009, 18:50
Ich hab eben festgestellt das die Befehle dir ich sende nicht vollständig ankommen
Wenn ich z.B. sende


serialport1.Write ("anX" + (1).tostring + Chr(13))

Kommt am AVR nur "an" an, ich hab schon die BaudRate verändert aber daran scheint es nicht zuliegen.
Was könnte das verursachen?

Willa
01.03.2009, 19:11
sendest du den string nur ein mal oder wird der immer wieder gesendet z.B. durch einen Timer?

Crischan
01.03.2009, 19:13
Nur einmal über ein Buttom

Crischan
01.03.2009, 20:19
Ich hab ne vermutung

Könnte an an Waitms liegen? Denn selbst wenn ich Print weglasse kommt nicht alles an, vllt bei 20mal drücken des buttom kommt mal der vollständige Code an.

Aber ohne Waitms und mit Print reagiert mein tool nicht mehr :(

Willa
01.03.2009, 20:40
Kann mir irgendwie grad schwer deinen Programmablauf vorstellen... vielleicht solltest du mal genau schreiben was wann passiert. Also erst ischarwaiting, dann input dann waitms etc pp...

Crischan
01.03.2009, 20:44
Bascom


'===CHIP SETTINGS===
Declare Sub Abfrage() As Byte

$regfile = "m32def.dat"
$framesize = 64
$swstack = 64
$hwstack = 64

$crystal = 16000000 'Quarzfrequenz
$baud = 19200
Config Scl = Portc.0 'Ports fuer IIC-Bus
Config Sda = Portc.1





Dim Inputstring As String * 10
Dim I As Byte
Dim A As Byte

Const I2crnmotorslaveadr = &H58 'I2C SlaveAdresse von RN-Schrittmotor Erweiterung
Const I2crnmotorsreadlaveadr = &H59 'I2C SlaveAdresse von RN-Schrittmotor Erweiterung
Dim I2cdaten(7) As Byte

Const Befehl_endlosdrehung = 54
Const Motor_1 = 3

Dim Extrahierter_integer As Integer
Dim Motor_speed_x As Byte
Dim Motor_x_an_aus As Byte
Dim Motor_speed_y As Byte
Dim Motor_y_an_aus As Byte
Dim Motor_x_richtung As Byte
Dim Motor_y_richtung As Byte
Dim Motor_x_weg As Byte
Dim Trackbar_wert_string As String * 10
Dim Trackbar_wert_byte As Byte

Dim Schritte As Long
Dim Temp As Byte
Dim Ltemp As Long
Dim Umdrehungen As Single
Dim Fahrstrecke As Word

Dim Startt As Byte
Dim Data_available As Byte




Do

Data_available = Ischarwaiting()
If Len(data_available) <> 0 Then
input "" , Inputstring
Motor_speed_x = Instr(inputstring , "SpX")
Motor_x_an_aus = Instr(inputstring , "anX")
Motor_x_richtung = Instr(inputstring , "RiX")
Motor_x_weg = Instr(inputstring , "WeX")

Motor_speed_y = Instr(inputstring , "SpY")
Motor_y_an_aus = Instr(inputstring , "anY")
Motor_y_richtung = Instr(inputstring , "RiY")

If Motor_x_weg = 1 Then
Trackbar_wert_string = Mid(inputstring , 4)
Trackbar_wert_byte = Val(trackbar_wert_string)
Motor_x_weg = 0

I2cdaten(1) = 102
I2cdaten(2) = 1
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7

I2cstart
I2cwbyte I2crnmotorsreadlaveadr
I2crbyte Temp , Ack
Schritte = Temp
I2crbyte Temp , Ack
Ltemp = Temp * 256
Schritte = Schritte + Ltemp
I2crbyte Temp , Ack
Ltemp = Temp * 65536
Schritte = Schritte + Ltemp
I2crbyte Temp , Nack
Ltemp = Temp * 16777216
Schritte = Schritte + Ltemp
I2cstop
Print "WeX:" ; Schritte
'Umdrehungen = Schritte / 200
' Print "Umdrehungen: " ; Umdrehungen
' Fahrstrecke = Umdrehungen * 31.4
' Print "Der Roboter ist " ; Fahrstrecke ; " cm gefahren "
End If

If Motor_speed_x = 1 Then
Trackbar_wert_string = Mid(inputstring , 4)
Trackbar_wert_byte = Val(trackbar_wert_string)
Motor_speed_x = 0

I2cdaten(1) = 53
I2cdaten(2) = 1
I2cdaten(3) = Trackbar_wert_byte
I2cdaten(4) = 0
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7

End If

If Motor_x_an_aus = 1 Then
Trackbar_wert_string = Mid(inputstring , 4)
Trackbar_wert_byte = Val(trackbar_wert_string)
Motor_x_an_aus = 0

If Trackbar_wert_byte = 1 Then
I2cdaten(1) = Befehl_endlosdrehung
I2cdaten(2) = 1
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7
Else
I2cdaten(1) = 51
I2cdaten(2) = 1
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7
End If
End If

If Motor_x_richtung = 1 Then
Trackbar_wert_string = Mid(inputstring , 4)
Trackbar_wert_byte = Val(trackbar_wert_string)
Motor_x_richtung = 0

If Trackbar_wert_byte = 1 Then
I2cdaten(1) = 52
I2cdaten(2) = 1
I2cdaten(3) = Trackbar_wert_byte
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7

Else
I2cdaten(1) = 52
I2cdaten(2) = 1
I2cdaten(3) = Trackbar_wert_byte
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7
End If
End If


If Motor_speed_y = 1 Then
Trackbar_wert_string = Mid(inputstring , 4)
Trackbar_wert_byte = Val(trackbar_wert_string)
Motor_speed_y = 0

I2cdaten(1) = 53
I2cdaten(2) = 2
I2cdaten(3) = Trackbar_wert_byte
I2cdaten(4) = 0
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7

End If


If Motor_y_an_aus = 1 Then
Trackbar_wert_string = Mid(inputstring , 4)
Trackbar_wert_byte = Val(trackbar_wert_string)
Motor_y_an_aus = 0

If Trackbar_wert_byte = 1 Then
I2cdaten(1) = Befehl_endlosdrehung
I2cdaten(2) = 2
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7

Else
I2cdaten(1) = 51
I2cdaten(2) = 2
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7
End If
End If

If Motor_y_richtung = 1 Then
Trackbar_wert_string = Mid(inputstring , 4)
Trackbar_wert_byte = Val(trackbar_wert_string)
Motor_y_richtung = 0

If Trackbar_wert_byte = 1 Then
I2cdaten(1) = 52
I2cdaten(2) = 2
I2cdaten(3) = Trackbar_wert_byte
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7

Else
I2cdaten(1) = 52
I2cdaten(2) = 2
I2cdaten(3) = Trackbar_wert_byte
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7
End If
End If

End If
Print "Test"
Waitms 10
Loop
End


SharpDevelop


' Erstellt mit SharpDevelop.
' Benutzer: William
' Datum: 28.02.2009
' Zeit: 19:36
'
' Sie können diese Vorlage unter Extras > Optionen > Codeerstellung > Standardheader ändern.
'
Public Partial Class MainForm
Public Sub New()
' The Me.InitializeComponent call is required for Windows Forms designer support.
Me.InitializeComponent()
serialport1.Open

' TODO : Add constructor code after InitializeComponents
'
End Sub

Dim onX As Byte
Dim RichtungX As Byte
Dim onY As Byte
Dim RichtungY As Byte
Dim ContainsA As Boolean
Dim ContainsB As Boolean
Dim ContainsC As Boolean
Dim readvar As String
Dim A_Daten As String

Sub Timer1Tick(sender As Object, e As EventArgs)
if serialport1.BytesToRead > 0 then
Do
textbox1.AppendText (chr(SerialPort1.Readbyte))
textbox1.ScrollToCaret
If SerialPort1.BytesToRead = 0 Then
Exit Do
End If
Loop
end if

End Sub

Sub TrackBar2Scroll(sender As Object, e As EventArgs)
serialport1.Write ("SpX" + (Speed_motor_1.Value).tostring + Chr(13))
SpeedMotor1.text = 11- Speed_motor_1.Value
End Sub

Sub Button3Click(sender As Object, e As EventArgs)
If RichtungX = 0 Then
serialport1.Write ("RiX" + (1).tostring + Chr(13))
RichtungX = 1
Else
serialport1.Write ("RiX" + (0).tostring + Chr(13))
RichtungX = 0
End If
End Sub

Sub Button1Click(sender As Object, e As EventArgs)
If onX = 0 Then
serialport1.Write ("anX1" + Chr(13))
onX = 1
Else
serialport1.Write ("anX0" + Chr(13))
onX = 0
End If
End Sub

Sub TrackBar1Scroll(sender As Object, e As EventArgs)
serialport1.Write ("SpY" + (Speed_motor_2.Value).tostring + Chr(13))
SpeedMotor2.text = 11- Speed_motor_2.Value
End Sub

Sub Button2Click(sender As Object, e As EventArgs)
If onY = 0 Then
serialport1.Write ("anY1" + Chr(13))
onY = 1
Else
serialport1.Write ("anY0" + Chr(13))
onY = 0
End If
End Sub

Sub Button4Click(sender As Object, e As EventArgs)
If RichtungY = 0 Then
serialport1.Write ("RiY" + (1).tostring + Chr(13))
RichtungY = 1
Else
serialport1.Write ("RiY" + (0).tostring + Chr(13))
RichtungY = 0
End If
End Sub
End Class

Willa
01.03.2009, 20:55
vielleicht solltest du mal genau schreiben was wann passiert
das habe ich gesagt weil ich eigentlich keine große Lust habe deinen quellcode zu durchforsten... Aber vielleicht findet sich ja jemand der das mal durchguckt.

Crischan
01.03.2009, 20:56
Sry hatte das problem vergessen

So wie es jetzt oben ist kommt so gut wie kein String den ich vom Tool zum Avr sende vollständig an.
Lass ich das Waitms weg reagiert das Tool nicht mehr,

Crischan
01.03.2009, 21:02
Wie gesagt das Tool sendet die Stings nicht vollständig an den AVR
Lass ich Print weg und setzte Waitms auf 100 kommt auch nix vollständig an

Wenn ich Waitms und Print weglasse läuft alles super

Willa
01.03.2009, 22:16
Was mir grad als erstes mal auffällt:
Data_available = Ischarwaiting()
If Len(data_available) <> 0 Then

ist IMMER true. guck dir mal die hilfe zu ischarwaiting an. Vielleicht ist das ja schon die lösung

Crischan
01.03.2009, 22:42
Hab das jetzt geändert in


Data_available = Ischarwaiting()
If Data_available = 1 Then


Aber es hat nix gebracht, denn immer wenn ich Waitms reinschreibe ( in Bascom) kommen die Strings nicht mehr vollständig am AVR an :(

Ich steh voll aufm schlauch hier, mir fehlt leider die erfahrung um so ein problem zulösen

Willa
01.03.2009, 22:56
Ich glaub das Problem ist waitms, denn jeder string der per rs232 reinkommt muss sofort abgeholt werden damit dein Programm nicht durcheinanderkommt. Wenn zwei Strings im Buffer sind funktioniert das mit dem markieren der strings nicht mehr richtig könnte ich mir vorstellen.
Ersetze das waitms doch durch einen timergesteuerten interrupt. Wie das geht steht bestimmt im wiki.

Crischan
01.03.2009, 23:41
Hm
Ich hab mir das mal angeschaut im Wiki ( https://www.roboternetz.de/wissen/index.php/Bascom_und_Timer ) und mit google hab ich auch gesucht aber verstehen tu ich es nicht wirklich wie ein Timer funktioniert, ich weis nur das er das hauptprogramm unterbricht, runterzahlt und das hauptprogramm fortfährt, aber wie er das macht und wie ich das einsetzten soll versteh ich nicht

Willa
02.03.2009, 08:39
In deinem Timer kannst du z.b. eine Variable hochzählen. Wenn die bei z.B. 100 angekommen ist dann wird dein Programm fortgeführt, ansonsten nicht. Ist dann etwas ähnliches wie waitms.
Mit Print willst du deine Sensordaten ausgeben? Leg das Print doch auch einfach in ein
if senden = 1 then
print blabla
end if
Und dann hast du in sharp develop halt einen timer der alle 1000ms deinen µC auffordert etwas zu senden. Es gibt sooo viele möglichkeiten das ganze zu machen. Du musst halt mal mit etwas einfacherem Code rumexperimentieren. Evtl. hilft es dir mal bei "CONFIG SERIALIN" in der bascom hilfe zu gucken.

Crischan
02.03.2009, 11:12
Juhu Danke Willa

Es läuft endlich so wie ich es wollte
Danke für deine geduld und das du dich nicht aufgeregt :)

Willa
02.03.2009, 11:51
Schön dass es funktioniert :) Und nicht vergessen: Never touch a running system :-b
Woran lag es denn, bzw. wie hast die die Probleme beseitigt?

Crischan
02.03.2009, 11:54
Ich hab in Bascom die Zeilen


Config Serialin = Buffered , Size = 20
Enable Interrupts

hinzugefügt

Neutro
02.03.2009, 13:04
Hallo Crischan,
wärst du so nett deinen Bascom Code und den Sharp Code komplett
zu posten? Ich interessiere mich auch dafür wie das Problem gelöst wurde.

Gruß

Neutro

Crischan
02.03.2009, 13:06
Oh ich hab im moment caos im Quellcode, aber wenn ich es geordnet und das tool fertig ist stell ich es hier gerne rein

Crischan
04.03.2009, 00:40
Hallo

Frage:

Wie kann ich ein Array senden?
Ich hab das schon mit


Dim myArray(9) As String , A As Integer ,B As Integer

Sub Button1Click(sender As Object, e As EventArgs)
myArray(0) = A
myArray(1) = B
serialport1.Write (myArray)
End Sub

versucht das geht aber leider nicht, denn er schmeist mir eine fehler meldund raus


Der Wert vom Typ "1-dimensionales Array von String" kann nicht in "String" konvertiert werden. (BC30311)

auf die Zeile


serialport1.Write (myArray)

Was mach ich da falsch?

Willa
04.03.2009, 08:21
Das musst du schon einzeln senden. Also:
for i = 1 bis länge array
sende array(i).tostring
sende chr(13)
next

Könnte sein dass das nicht funktioniert weil die Werte dann wirklich direkt hintereinander gesendet werden. Aber probier halt mal.

Crischan
04.03.2009, 11:53
hm

Ich geh mal davon aus das dass in Bascom dann in etwa so aussehen muss


Input A, B, C

oder?

Crischan
04.03.2009, 13:00
Ich habs hinbekommen danke dir

Crischan
08.03.2009, 20:45
Hallo

Ich hab jetzt mal eine vorabversion, ist noch nicht ganz Stabil und noch nicht vollsändig.

Das Tool Steuert mit dem RN-Control v1.4 übers I2C Kabel ein RN-Schrittmotorsteuerungsboard an, das RN-Controlboard wird über den RS232-port am Com-port1 des Pcs angeschlossen (Port auswahl gibt es bisher noch keine)

Bild
http://www.siteupload.de/t929170-NeuBitmapJPG.JPG (http://www.siteupload.de/p929170-NeuBitmapJPG.html)

Tool
RN-SchrittmotorSteuerung.zip (http://www.siteupload.de/p929158-RNSchrittmotorSteuerungzip.html)

AVR Code (RN-Control v1.4)


'===CHIP SETTINGS===
Declare Sub Abfrage() As Byte

$regfile = "m32def.dat"
$framesize = 64
$swstack = 64
$hwstack = 64

$crystal = 16000000 'Quarzfrequenz
$baud = 38400

Config Scl = Portc.0 'Ports fuer IIC-Bus
Config Sda = Portc.1

'===CHIP SETTINGS END===


Config Serialin = Buffered , Size = 20
Enable Interrupts

Dim Inputstring1 As Byte
Dim Inputstring2 As Byte
Dim Inputstring3 As Byte
Dim Inputstring4 As Byte
Const Inputstring5 = 0


Const I2crnmotorslaveadr = &H58 'I2C SlaveAdresse von RN-Schrittmotor Erweiterung
Const I2crnmotorsreadlaveadr = &H59 'I2C SlaveAdresse von RN-Schrittmotor Erweiterung


Dim I2cdaten(7) As Byte

Dim Schritte As Long
Dim Temp As Byte
Dim Ltemp As Long
Dim Umdrehungen As Single
Dim Fahrstrecke As Word


Dim Data_available As Byte
Dim Endschalter As Byte
Dim Motorstatus As Byte



Do

Data_available = Ischarwaiting()
If Data_available = 1 Then

Input "" , Inputstring1 , Inputstring2 , Inputstring3 , Inputstring4 ', Inputstring5
I2cdaten(1) = Inputstring1
I2cdaten(2) = Inputstring2
I2cdaten(3) = Inputstring3
I2cdaten(4) = Inputstring4
I2cdaten(5) = Inputstring5
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7

If Inputstring1 = 101 Then
If Inputstring2 = 1 Then
I2cstart
I2cwbyte I2crnmotorsreadlaveadr
I2crbyte Motorstatus , Nack
I2cstop
Print "Motorstatus_Motor1" ; Motorstatus
Else
I2cstart
I2cwbyte I2crnmotorsreadlaveadr
I2crbyte Motorstatus , Nack
I2cstop
Print "Motorstatus_Motor2" ; Motorstatus
End If
End If
End If
I2cdaten(1) = 102
I2cdaten(2) = 1
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7

I2cstart
I2cwbyte I2crnmotorsreadlaveadr
I2crbyte Temp , Ack
Schritte = Temp
I2crbyte Temp , Ack
Ltemp = Temp * 256
Schritte = Schritte + Ltemp
I2crbyte Temp , Ack
Ltemp = Temp * 65536
Schritte = Schritte + Ltemp
I2crbyte Temp , Nack
Ltemp = Temp * 16777216
Schritte = Schritte + Ltemp
I2cstop
Print "A" ; Schritte ' Motor 1
Waitms 10

I2cdaten(1) = 102
I2cdaten(2) = 2
I2csend I2crnmotorslaveadr , I2cdaten(1) , 7

I2cstart
I2cwbyte I2crnmotorsreadlaveadr
I2crbyte Temp , Ack
Schritte = Temp
I2crbyte Temp , Ack
Ltemp = Temp * 256
Schritte = Schritte + Ltemp
I2crbyte Temp , Ack
Ltemp = Temp * 65536
Schritte = Schritte + Ltemp
I2crbyte Temp , Nack
Ltemp = Temp * 16777216
Schritte = Schritte + Ltemp
I2cstop
Print "B" ; Schritte ' Motor 2


Waitms 10
Loop
End


Tipps:
Bewegt die Regler nicht so schnell.
Sollte das Tool oder das Controlboard nicht reagieren Resetet beide Boards Manuell über den Tasten auf den Boards

Neutro
09.03.2009, 17:23
Danke für den Bascom Code,
wenn du jetzt noch die Sharp Dateien zur Verfügung stellen könntest,
würdest du mich so was von glücklich machen.........

Crischan
20.03.2009, 17:10
Hallo

hab da noch ein anliegen ich hab da leider nix mit google gefunden

Also ich kann mit 'Printbin' in Bascom arrays verschicken aber wie kann ich die in SharpDevelop empfangen und leserlich machen und wieder in ein array speichern?

mfg