Meine neue Erkentnis ist, das das Modul binär sendet.
Wäre schön, wenn hier jemand seine Erfahrungen mit dem Moodul posten würde.
Hallo,
ich habe ein 3D Sensorboard CHR-6d
http://www.shop.robotikhardware.de/s...roducts_id=221
Mit der software über meinen PC kann ich alle Werte sehen.
Wie sehen die Empfangenen Daten aus? Laut Datenblatt müssten die Daten Hexadezimal ausgegeben werden.
Das Hyper Termnal macht bei mir deshalb nur Hyroglyphen.
Hat jemand einen Bascom Codeschnipsel für mich, um diese Daten in normale ASCI Zeichensätze umzuwandeln und in verschiedene Variablen zu schreiben?
Vielen Dank Im vorraus.
Um die UART mit 115200 Baut zu betreiben benötigt man einen Quarz zB. einen 7,3728 MHz oder einen 18,432 MHz Quarz.
Meine neue Erkentnis ist, das das Modul binär sendet.
Wäre schön, wenn hier jemand seine Erfahrungen mit dem Moodul posten würde.
Guten morgen,
ich habe dieses Board auch hier. Funktioniert denn das alles mit dem mitgelieferten Programm?
Peter
_________________________________________________
[-X Quis custodiet ipsos custodes![]()
Ground-Effect-Stability-Robotwww.peter-holzknecht.de
Die Übertragung per UART ist immer binär, eine Abfolge von H und L - Pegeln, die für 0 und 1 als Bits stehen und die dann in der Regel ein Byte werden, dass dann beim AVR im UDR-Register landet.
im Datenblatt:
http://www.pololu.com/file/0J276/chr6d_datasheet.pdf
Seite 7 steht wie der Sensor seine Daten übermittelt, nämlich als Abfolge von mehreren Bytes als Message, die mit der Zeichenfolge ASCII "s" "n" und "p" beginnen.
http://www.torsten-horn.de/techdocs/ascii.htm
sprich im UDR-Register tauchen nacheinander die Bytes / Zeichen
"s" / 115
"n" / 110
"p" / 112 auf
dann dahinter die Daten.
Wie im Datenblatt beschrieben.
Vor den Erfolg haben die Götter den Schweiß gesetzt
Hi,
Mit dem Programm kann ich alle achsen sehen.
Mit meinem alten xp Rechner funktionierte es nicht, da kam eine Fehlermeldung. Das hat mit directx und Java zu tun, soweit ich das verstanden habe.
Mit meinem Notebook mit windows 7 funktionierte es sofort.
Ich benutzte von myavr das UART to USB Modul.
Per Terminalprogramm bekam ich nur Hiroglyphen. Mit dem Serial Programm von Robotikhardware, das gleiche. Wenn ich auf Hex stelle, dann Zeigt er Hex werte an, ob die stimmen weiss ich nicht.
Es scheint, als ob das Terminalprogramm nicht weis, wann ein Datenpaket zu ende ist und wann das neue anfängt.
Es werden wohl auf keinen Fall Achsinformationen wie roll=WERT, accZ= WERT ausgegeben, sondern nur die Werte hintereinander weg.
hi Vitis,
danke für deine Nachricht.
Das eine UART nur Binär senden kann ist ja logisch wo du mich mit der Nase drauf gestossen hast.![]()
Warum kann mann diese Abfolge dann nicht im Terminalprogramm sehen?
Da die Paketlänge vom Standart abweicht und von den gesendeten Kanälen abhängig ist. (Die Kanäle können mit dem Tool von CH Robotics einzeil abgeschaltet werden.)
Die Paketlänge besteht aus 7 + Gesendete Kanäle Bytes.
Somit ist eine klare Anzeige über ein Terminalprogramm nicht möglich.
Bitte berichtigt mich, wenn ich was falsches geschrieben habe.
Es soll ja später für alle eine korrekte Ausarbeitung sein.
Hier mal mein Code für das einlesen Per UART und Aufteilen des Strings in Bytes.
Warum kann ich den auseinandergeschnittenen String nicht als Byte Dimensionieren? z.B: Gyroz?Code:$regfile = "m8def.dat" $crystal = 7372800 $baud = 115200 Dim E As String * 13 'Länge des Strings hier einstellen. Abhängig von den gesendeten Kanälen. Dim Gyroz As String * 1 Dim Gyroy As String * 1 Dim Gyrox As String * 1 Dim Accz As String * 1 Dim Accy As String * 1 Dim Accx As String * 1 Dim Anfang As String * 1 On Urxc Onrxd 'Interrupt auslösen, wenn volsändiges Zeichen geladen. Enable Urxc Enable Interrupts '------------------------------------------------------------------------ Do Anfang = Left(e , 1) '1. Byte lesen If Anfang = "115" Then 'Anfang des Datensatzes abwarten,damit nicht mittendrin in den String geschrieben wird. E = "" End If If Len(e) > 12 Then 'wenn kompletter Datensatz geschickt, dann in einzelne Variablen aufteilen. Gosub Werte End If Loop Onrxd: E = E + Chr(udr) 'neu empfangenes Byte anhängen Return Werte: Gyroz = Mid(e , 5 , 1) 'String e wird in die einzelnen Werte verteilt. Gyroy = Mid(e , 6 , 1) Gyrox = Mid(e , 7 , 1) Accz = Mid(e , 8 , 1) Accy = Mid(e , 9 , 1) Accx = Mid(e , 10 , 1) E = "" Return End
Ist das abwarten bis ein p(115) gesendet wird so richtig?
If Anfang = "115" Then
E = ""
Wenn jemand etwas auffällt, bitte Posten![]()
Warum geht beim Nachricht schreiben der Scrollbalken in die Mitte dier Nachricht wenn die Nachrichtenbox voll geschrieben ist?
Das nervt gewaltig
Habs rausgefunden.
Internet Explorer 8 nur in der Kompatibilitätsansicht verwenden.
das wird so nicht funktionieren, da ja die Datenbytes alles Mögliche enthalten können, unter Anderem auch den Binärwert von s und p.
Das wird nur gehen wenn Du nen Ringpuffer verwendest, der mindestens 2mal die Paketlänge lang ist und dann quasi ne maske darüber schiebst.
Sprich erst schiebst Du "snp" über den puffer, wenn da eine Übereinstimmung ist wertest Du das Type-byte aus, ob Du dieses Paket überhaupt haben willst, dann liest Du die Paketlänge aus und hüpfst die angegebene Paketlänge über den Buffer und bildest die 2 angehängten checksummenbytes aus um das Paket auf Richtigkeit zu prüfen.
Dann und nur dann ist das ne gültige Message.
schau Dir mal Overlayvariablen und Array an.
du schreibst dann per urxc in den array und zählst den pointer hoch
also pseudocode
dim puffer(40) as byte
dim pufferstring as string*39 at puffer overlay
:uartempfang
incr pufferpointer
puffer(pointer)=udr
if pufferpointer>39 then pufferpinter=0
return
:auswertung
For Zaehler = 1 To 40
Zeichenpointer=Zaehler
If Puffer(zeichenpointer) = "s" Then
Incr Zeichenpointer
If Zeichenpointer > 40 Then
Zeichenpointer = Zaehler - 40
endif
If Puffer(zeichenpointer) = "n" Then
Incr Zeichenpointer
If Zeichenpointer > 40 Then
Zeichenpointer = Zeichenpointer - 40
End If
If Puffer(zeichenpointer) = "p" Then
Snp_erkannt_flag = Zeichenpointer
Else
Snp_erkannt_flag = 0
End If
else
Snp_erkannt_flag = 0
End If
else
Snp_erkannt_flag = 0
End If
Next
If Snp_erkannt_flag > 0 Then
Gosub Weiter_zur_auswertung
End If
return
irgendwie so halt
return
Vor den Erfolg haben die Götter den Schweiß gesetzt
Ich benutze in einem Array 2 Zeiger. Den ersten Zeiger für aus dem UDR Register zu speichern und den 2. Zeiger um eine For next schleife zu benutzen um den Datensatzanfang zu finden. Ist der Datensatzanfang gefunden werden die Nachfolgenden 6 Bytes ausgelesen.
Wenn das Hauptrogramm beim USART Interrupt für ein neu angekommenes Zeichen anhält, kann es sein das sich das Schreiben und das Lesen im Array überschneidet, so das Datenschrott ausgelesen wird?
Lesezeichen