05.11.2006, 21:45
Beitrag #1
|
Mark_labview
LVF-Grünschnabel
Beiträge: 14
Registriert seit: May 2005
kA
|
Serielle Komunikation mit Mikrocontroller
Hallo Zusammen,
Ich habe folgendes Problem:
Ich möchte eine Zahl im Bereich von 0-255, also ein Byte, an meinen Mikrocontroller übertragen. Dazu müsste ich die Zahl in ein ASCII Zeichen umwandeln. Das habe ich mit viel Aufwand auch geschaft, das dumme ist das dabei offenbar die Windows ASCII-tabelle verwendet wird, mein Controller arbeitet aber mit IBM-Standart.
So, giebt es eine Möglichkeit die VISA Schnittstelle Bitweise anzusprechen oder meine eigene ACII-Tabelle anzulegen? Das blöde aber wäre das ich nicht weis wie ich die ganzen Sonderzeichen da eintragen soll/muss.
Vielen Dank für eure Hilfe!
|
|
|
06.11.2006, 09:34
Beitrag #2
|
Oliver Listing
LVF-Freak
Beiträge: 721
Registriert seit: Sep 2004
2012 und 2014 (Windows und Linux)
1998
EN
22844
Deutschland
|
Serielle Komunikation mit Mikrocontroller
Hi Mark,
' schrieb:Hallo Zusammen,
Ich habe folgendes Problem:
Ich möchte eine Zahl im Bereich von 0-255, also ein Byte, an meinen Mikrocontroller übertragen. Dazu müsste ich die Zahl in ein ASCII Zeichen umwandeln. Das habe ich mit viel Aufwand auch geschaft, das dumme ist das dabei offenbar die Windows ASCII-tabelle verwendet wird, mein Controller arbeitet aber mit IBM-Standart.
So, giebt es eine Möglichkeit die VISA Schnittstelle Bitweise anzusprechen oder meine eigene ACII-Tabelle anzulegen? Das blöde aber wäre das ich nicht weis wie ich die ganzen Sonderzeichen da eintragen soll/muss.
Vielen Dank für eure Hilfe!
da muß dir ein anderer Fehler unterlaufen sein.
Zum Ersten eine Zahl wandelst du am schnellsten, wie schon sooft im Forum beschrieben, mit der Funktion Byte Array To String in ein String um ( FunctionsNumericConversion). Vorher noch ein Build Array einschieben.
Zum Anderen ist es völlig egal in welches sichtbare Zeichen dein Betriebssystem es umwandelt. Es zählt einzig und alleine die Bitreihenfolge, die über die Serielle Schnittstelle gesendet wird und die wird wieder deiner Zahl entsprechen. Du kannst dies einfach mit einem Speicherozzi oder RS232-Analyser nachprüfen.
Mit welcher Tabelle Windows also gearbeitet hat ist egal - es steckt immernoch die gleiche Zahl dahinter.
Gruß
Oliver
|
|
|
06.11.2006, 09:52
Beitrag #3
|
IchSelbst
LVF-Guru
Beiträge: 3.696
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
Serielle Komunikation mit Mikrocontroller
' schrieb:Ich möchte eine Zahl im Bereich von 0-255, also ein Byte, an meinen Mikrocontroller übertragen. Dazu müsste ich die Zahl in ein ASCII Zeichen umwandeln.
Ein ASCII-Zeichen ist eine Zahl im Bereich von 0 bis 255.
Ein Byte ist eine Typbezeichnung mit der Breite 8 Bit.
ASCII, HEX, Dezimal und wie sie alle heißen ist eine Darstellungsform einer Zahl. Hex 0x41 = DEC 65 = ASCII 'A'. Darstellungsformen an sich kann man aber nicht übertragen. Übertragen kann man nur Zahlen. Willst du das Byte 65 - also z.B. ASCII 'A' - in Hexform übertragen musst du die beiden Zahlen für '4' und '1', also 0x34 und 0x31 übertragen.
Zitat:Das habe ich mit viel Aufwand auch geschaft,
Da für mich ASCII und Binär identisch ist, kann ich diesen Aufwand nicht nachvollziehen.
Zitat:das dumme ist das dabei offenbar die Windows ASCII-tabelle verwendet wird, mein Controller arbeitet aber mit IBM-Standart.
Die ASCII-Tabelle ist normiert. Oder möchtest du EBCDIC übertragen (was ich mir eigentlich nicht vorstellen kann)?
Zum Umwandeln Zahl in String siehe Posting von Oliver Frank.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
06.11.2006, 10:24
Beitrag #4
|
Y-P
☻ᴥᴥᴥ☻ᴥᴥᴥ☻
Beiträge: 12.612
Registriert seit: Feb 2006
Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN
71083
Deutschland
|
Serielle Komunikation mit Mikrocontroller
Hallo,
meines Erachtens muss 41 (hex) nicht mehr in Hex umgewandelt werden, bevor es übertragen wird, wenn ich ASCII 'A' rüberschicken möchte.
Gruß Markus
' schrieb:ASCII, HEX, Dezimal und wie sie alle heißen ist eine Darstellungsform einer Zahl. Hex 0x41 = DEC 65 = ASCII 'A'. Darstellungsformen an sich kann man aber nicht übertragen. Übertragen kann man nur Zahlen. Willst du das Byte 65 - also z.B. ASCII 'A' - in Hexform übertragen musst du die beiden Zahlen für '4' und '1', also 0x34 und 0x31 übertragen.
--------------------------------------------------------------------------
Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
|
|
|
06.11.2006, 10:31
Beitrag #5
|
|
|
06.11.2006, 10:54
Beitrag #6
|
IchSelbst
LVF-Guru
Beiträge: 3.696
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
Serielle Komunikation mit Mikrocontroller
' schrieb:meines Erachtens muss 41 (hex) nicht mehr in Hex umgewandelt werden, bevor es übertragen wird, wenn ich ASCII 'A' rüberschicken möchte.
Das ist richtig.
Wenn ich ASCII übertragen will, brauche ich nicht wandeln.
Muss ich aber HEX übertragen, weil die Gegenseite quasi lesbare Zeichen verlangt - nämlich HEX-Darstellung - muss ich die beiden ASCII-Zeichen der Hex-Darstellung übertragen.
Im übrigen bin ich der Meinung, dass Mark_LabVIEW möglicherweise eine Hex-Übertragung meint, auch wenn er ASCII schreibt.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
06.11.2006, 21:17
Beitrag #7
|
Mark_labview
LVF-Grünschnabel
Beiträge: 14
Registriert seit: May 2005
kA
|
Serielle Komunikation mit Mikrocontroller
<div align="left">
Hallo,
ersteinmal allen vielen Dank für eure Antworten!
Zitat:Zum Anderen ist es völlig egal in welches sichtbare Zeichen dein Betriebssystem es umwandelt. Es zählt einzig und alleine die Bitreihenfolge, die über die Serielle Schnittstelle gesendet wird und die wird wieder deiner Zahl entsprechen.
Das ist mir im laufe des gestrigen Abends auch bewusst geworden. Dann habe ich den ganzen Abend damit zugebracht, zu Rätzeln wo den dan mein Fehler noch liegen könnte. Da ich nicht drauf gekommen bin geb ich das Rätzel jetzt an euch weiter. Ich geb zu das das eine harte Nuss ist da der Fehler sowohl bei LabVIEW als auch in meinem Microkontroller Programm liegen kann. Und beide habt ihr nicht vorliegen. Naja villeicht hat doch jemand eine Idee mit den folgenden Hinweisen:
Also wie gesagt ich wandle eine Integer Zahl in ein ASCII-Zeichen und schike es dann über RS232 zu meinem Controller. Das was dort ankommt gebe ich ohne umschweife auf einem Display aus. Ein speicheroszy besitze ich leider keines, kann mir also die Daten dazwischen nicht ansehen. Das Ergebniss: Ich stelle fest das einige Zaheln korrekt ankommen, andere nicht. Ich hab mal eine kleine ( nicht vollständige liste gemacht) Villeicht erkennt ja jemand einen Algorythmus der auf das Problem schliesen lässt. Danke und viel Spass beim Rätzeln!
gesendet - empfangen
0 - 248
1 - 249
2 - 250
3 - 251
4 - 252
5 - 253
6 - 254
7 - 255
8 - 8
9 - 9
10 - 10
11 - 11
12 - 12
13 - 13
14 - 14
15 - 15
16 - 136
17 - 137
18 - 138
19 - 139
20 - 140
21 - 141
22 - 142
23 - 143
24 - 136
25 - 137
26 - 138
27 - 139
28 - 140
29 - 141
30 - 142
31 - 143
32 - 200
33 - 201
40 - 40
41 - 41
48 - 200
49 - 201
64 - 232
72 - 72
73 - 73
74 - 74
104 - 104
105 - 105
</div>
|
|
|
06.11.2006, 21:33
Beitrag #8
|
Mr.T
LVF-SeniorMod
Beiträge: 1.007
Registriert seit: Jun 2005
2009
2005
kA
88400
Deutschland
|
Serielle Komunikation mit Mikrocontroller
Hallo!
Jetzt mische ich auch mal mit.
Da in Deiner Liste 16 UND 24 die selbe Zahl zu erzeugen scheint muß hier ein Logikfehler in der Interpretation der Bits vorliegen. Wertest Du evtl. Start und Stoppbits mit aus?
Einige von uns sind aber auch C-Programmiertauglich. Vielleicht postest Du einfach mal Dein VI und den Empfangssourcecode Deines Controlers - dann kann Dir sicher geholfen werden. Oder Du Postest hier Dein VI und im http://www.cplusplus-forum.de den C-Code. Ich gehe jetuzt einfach mal davon aus, dass der Controller in C/C++/C# Programmiert wurde.
Gruß und programmiere in Zukunft einfach auch die Controller mit LabVIEW - dann klappts einfacher !
Mit einem freundlichen Wort und etwas Gewalt erreicht man viel mehr als nur mit einem freundlichen Wort. [...Marcus zu Lennier, B5]
|
|
|
06.11.2006, 22:14
Beitrag #9
|
|
|
06.11.2006, 22:44
|
eg
LVF-SeniorMod
Beiträge: 3.868
Registriert seit: Nov 2005
2016
2003
kA
66111
Deutschland
|
Serielle Komunikation mit Mikrocontroller
Wenn es wirklich wiederholbar ist, dann tippe ich auf die Darstellung. Im Mikrocontrollerprogramm, musst du die empfangenen Zeichen mit printf() ausgeben (wenn du in C programmierst) aber vorher auf BYTE casten. Ich will wirklich, wie Mr.T. schon gesagt hat deine Empfangs- und Sende-routinen in LV als auch in C anschauen.
Der Denkfehler steckt wie immer in der Vorstellung (Binär <-> ASCII).
Gruss, Eugen
|
|
|
| |