LabVIEWForum.de - Serielle Komunikation mit Mikrocontroller

LabVIEWForum.de

Normale Version: Serielle Komunikation mit Mikrocontroller
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3
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!
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
' 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.
Hallo,

meines Erachtens muss 41 (hex) nicht mehr in Hex umgewandelt werden, bevor es übertragen wird, wenn ich ASCII 'A' rüberschicken möchte. Wink

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.
' schrieb:meines Erachtens muss 41 (hex) nicht mehr in Hex umgewandelt werden, bevor es übertragen wird, wenn ich ASCII 'A' rüberschicken möchte. Wink
ich kann mich Markus da nur anschließen...

Gruß
Oliver
' schrieb:meines Erachtens muss 41 (hex) nicht mehr in Hex umgewandelt werden, bevor es übertragen wird, wenn ich ASCII 'A' rüberschicken möchte. Wink
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. Wink
<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>
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 Big Grin!

Tongue
Ich tippe auf Baudrate in LV schneller als im Controller.
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
Seiten: 1 2 3
Referenz-URLs