Forum: Mikrocontroller und Digitale Elektronik Welche Zeichen kommen aus dem Uart?


von Thomas (Gast)


Lesenswert?

Hallo Zusammen!

Ich möchte per Uart eine 2 Byte Zahl von einem MSP430F2616 an den 
Rechner schicken.
Bei einem bestehendem Gerät funktioniert dies bereits, jedoch mit einem 
TMS 370.
Bei einem (meinem) neuen Gerät funktionert dies nur mit einer Hex- bzw. 
1 Byte Zahl. Und das duzgehörige Programm kann aber nur mit dem alten 
Format was anfangen.

Jetzt die Frage:
Ich weis nicht weiter, da ich nicht verstehe worin der Unterschied 
zwischen den Beiden Formaten besteht. Das RS232 Terminal zeigt mir 
einerseits in ASCII die 2 BYTE Zahl des alten Formats an und zum anderen 
nur(ASCII) Punkte des neuen Formats.

Wie kann ich die Configuaration der alten Schnittstelle eines TMS370 
anhand des Datenstrings herausbekommen

mfg
Thomas

von Ingo (Gast)


Lesenswert?

Wenn du einen 16 Bit Wert sendest sendest du erst das High Byte dann das 
Low Byte.

von Dosmo (Gast)


Lesenswert?

Hab Dein Problem nicht ganz verstanden, aber es hört sich so an, als ob 
Dein altes Ding die Zahl als ASCII-String verschickt.
Im diesem Fall würde die Zahl 8Bit-Zahl 0x10 als zwei getrennte 
8Bit-ASCII-Codes ('1' = 0x31 und '0' = 0x30) gesendet. Dies hat den 
Vorteil, daß man im Terminalprogramm "Klartext" sieht.

Wenn Dein neues Ding hingegen die 8Bit-Zahl 0x10 als ASCII-Code 0x10 
versendet, kommt am Terminalprogramm ein "Linefeed" an.
Siehe
http://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange

von Karl H. (kbuchegg)


Lesenswert?

Thomas schrieb:

> Jetzt die Frage:
> Ich weis nicht weiter, da ich nicht verstehe worin der Unterschied
> zwischen den Beiden Formaten besteht. Das RS232 Terminal zeigt mir
> einerseits in ASCII die 2 BYTE Zahl des alten Formats an und zum anderen
> nur(ASCII) Punkte des neuen Formats.

ergänzend:

Benutz als Terminal HTerm. Das kann dir die übertragenen Bytes in ihrer 
Hexadezimalen Form UND die Interpretation dieser Bytes als ASCII Zeichen 
gleichzeitig anzeigen.

Dann solltest du den Unterschied sofort sehen.

von Thomas (Gast)


Lesenswert?

@Karl Heinz Buchegger

also der Unterschied ist das beim alten Ding die Hexzahlen irgendwie 
einen Code ergebender dann (für mich zufällig) eine Ascii Zahl ergibt.
------------------------------------------------------------------------ 
--

wenn ich nun die HEX Zahlen nach Ascii Zahlen nach Dosmo von hand 
codiere  dann krieg ich das auch hin.

Das wäre also genau die Lösung:


mit Steuerzeichen eine String Kette erstellen.

Wenn ich nun eine Sterzeichentabelle hernehme und mir das angesprochene 
Linefeed raussuche, dann ist das in diesem Falle ein 0x0a, und das kommt 
auch alle 4 Byte + 1Byte "Carriage Return" (0x0d) vor.


also muss ich meinem Uart beibringen das er nicht nur den Buffer sendet 
sondern die Steuerzeichen beachtet.

Das ist natürlich eine Ganz andere Situation

halt nicht das was mir zu dem Projekt erzählt wurde.

ich bedanke Mich!!!
mfg Thomas

von Ralf G. (ralg)


Lesenswert?

Thomas schrieb:
> also muss ich meinem Uart beibringen das er nicht nur den Buffer sendet
> sondern die Steuerzeichen beachtet.

Dem UART sicher nicht!

von Karl H. (kbuchegg)


Lesenswert?

Thomas schrieb:

> halt nicht das was mir zu dem Projekt erzählt wurde.

Um ehrlich zu sein bin ich mir nicht sicher ob du verstanden hast, was 
das Problem ist.

Das ein mal wird offenbar so gesendet

   int i = 20;

   uart_write_byte( i >> 8 );     // das HighByte
   uart_write_byte( i & 0x0F );   // das LowByte

und das andere mal so

  int i = 20;
  char buffer[10];

  sprintf( buffer, "%d\n", i );
  uart_write_string( buffer );


Das eine mal eben direkt die Bytes in ihrer binären Repräsentierung und 
das andere mal indem zuerst ein Text erzeugt wird und dann dieser Text 
gesendet wird.

> also muss ich meinem Uart beibringen das er nicht nur den Buffer
> sendet sondern die Steuerzeichen beachtet.

typischerweise geht das den UART selber überhaupt nichts an. In letzter 
Konsequenz kriegt der ein paar Bytes, die er über die Leitung rausbläst 
(bzw. umgekehrt reinkommende Bytes in einem Buffer ablegt). Was diese 
Bytes dann bedeuten interessiert die UART einen feuchten Kehrricht. Es 
ist einzig und alleine dein Programm, welches darüber entscheidet, was 
mit diesen Bytes zu tun ist.

von Dosmo (Gast)


Lesenswert?

Thomas schrieb:
> Das ist natürlich eine Ganz andere Situation
>
> halt nicht das was mir zu dem Projekt erzählt wurde.

Idealerweise gibt es so etwas wie eine Protokollspezifikation, wo genau 
solche Sachen drinnstehen.

PS:
Mein Fehler: 0x10 ist natürlich nicht Linefeed, sondern 0x0A - Doof!

von Thomas (Gast)


Lesenswert?

Also nochmal wiederholen.

klar der Uart kann in meinem fall nur 1 Byte auf einemal übertragen und 
der Syntax muss ausserhalb des Uart geklärt werden.

ich muss meiner Uart_sende_Funktion beibringen das sie anstatt einer 
Zahl
z = 3735
sechs Zeichen Sendet warscheinlich so:

Uart_string_buffer_2_byte_zahl_z[6] =
            {
              0x33;
              0x37;
              0x33;
              0x35;
              0x0d;
              0x0a;
             }

Oder meinst du das wenn ich einen String mit vier zeichen erzeuge und 
mit Sprintf formatiere/umlade das dann die Steuerzeichen  schon drin 
sind? Hab solche Sachen noch nie so machen müssen...

mfg Thomas

von Uwe (Gast)


Lesenswert?

Wenn du hinten ein \n dranmachst für newline macht er das auch.
google mal printf
printf("%d \n",i);
printf kostet aber viel speicher im AVR.
Machs lieber selber.

von Dosmo (Gast)


Lesenswert?

Deine UART-Sendefunktion sollte einfach nur 1:1 einen Puffer senden.
Was Du in diesen Puffer hinschreibst, muß das richtige Format haben, 
aber das sollte an der Stelle berücksichtig werden, wo in den Puffer 
geschrieben wird, und nicht in der UART-Sendefunktion.
Es könnte gut sein, daß Du doch mal etwas anderes als ASCII-codierte 
Zahlen senden willst, neech?

von Karl H. (kbuchegg)


Lesenswert?

Thomas schrieb:
> Also nochmal wiederholen.
>
> klar der Uart kann in meinem fall nur 1 Byte auf einemal übertragen und
> der Syntax muss ausserhalb des Uart geklärt werden.
>
> ich muss meiner Uart_sende_Funktion beibringen das sie anstatt einer
> Zahl
> z = 3735
> sechs Zeichen Sendet warscheinlich so:
>
> Uart_string_buffer_2_byte_zahl_z[6] =
>             {
>               0x33;
>               0x37;
>               0x33;
>               0x35;
>               0x0d;
>               0x0a;
>              }
>
> Oder meinst du das wenn ich einen String mit vier zeichen erzeuge und
> mit Sprintf formatiere/umlade das dann die Steuerzeichen  schon drin
> sind? Hab solche Sachen noch nie so machen müssen...

Jetzt wundert mich deine Aussage, dass du so arm wärst, weil dir das 
niemand gesagt hat, nicht mehr.

void uart_print_int( int z )
{
   char buffer[20];
   sprintf( buffer, "%04d\r\n", (int)z );
   uart_print_string( buffer );
}

(oder wie dann eben die bisherige Funktion heißt, die einen int 
verschickt).

fertig ist die Umstellung unter der Voraussetzung das der Empfänger das 
auch wirklich so haben will.

Wenn du keine Protokollspezifikation hast, dann musst du dir im HTerm 
schon genau ansehen, was da über die Leitung flutscht. Das eine mal hast 
du nur einen \n, hier hast du plötzlich beides 0x0d und 0x0a. Einmal 
sind es 4 Bytes + 1 zur Endekennung. Dann sind es wieder 6 Bytes. Erhebt 
sich auch noch die Frage: müssen es immer 4 Bytes sein? was ist mit 
führenden 0-en? Müssen die gesendet werden oder nicht?

von Dosmo (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> sprintf( buffer, "%04d\r\n", (int)z );

Ich bin mir nicht so sicher, ob er wirklich eine 16Bit-Zahl senden will.
Vielleicht meinte er mit "eine 2 Byte Zahl" auch nur ein Byte, weil es 
in Hex-Darstellung zwei Nibble hat...

von Karl H. (kbuchegg)


Lesenswert?

Dosmo schrieb:
> Karl Heinz Buchegger schrieb:
>> sprintf( buffer, "%04d\r\n", (int)z );
>
> Ich bin mir nicht so sicher, ob er wirklich eine 16Bit-Zahl senden will.
> Vielleicht meinte er mit "eine 2 Byte Zahl" auch nur ein Byte, weil es
> in Hex-Darstellung zwei Nibble hat...


Ganz ehrlich:
Am einfachsten wäre es, wenn er einfach mal Screen Dumps von beiden 
Übertragungsvarianten im HTerm posten würde. Dann würden wir uns das 
selber aus dem Hex-Protokoll raussuchen. Zusammen mit den Angaben, was 
da eigentlich gesendet wird und welche Zahlenwerte das sein sollten, hat 
man sowas relativ schnell rausgefunden (solange nichts verschlüsselt 
ist).

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

so es sind 28mal 2BYTE und 2mal 4BYTE ZAHLEN ja eigenglich ist es ein 
String. Ergo brauch ich entweder eine Codierung mit variabler Codelänge 
oder halt zwei Codierungen. Ich muss das aber selber tun da es bei mir 
kein printf gibt.
mfg thomas

von Thomas (Gast)


Lesenswert?

So hat nun geklappt Zeichen können wie vom alten Gerät eingelesen 
werden.
mfg Thomas und ein Dankeschön für die Tipps und ich Wünsch ein schönes 
Wochenende

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.