www.mikrocontroller.net

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


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Thomas (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Ingo (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Wenn du einen 16 Bit Wert sendest sendest du erst das High Byte dann das 
Low Byte.

Autor: Dosmo (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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_Cod...

Autor: Karl Heinz Buchegger (kbuchegg) (Moderator)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Thomas (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Ralf G. (ralg)
Datum:

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

Dem UART sicher nicht!

Autor: Karl Heinz Buchegger (kbuchegg) (Moderator)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Dosmo (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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!

Autor: Thomas (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Uwe (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.

Autor: Dosmo (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: Karl Heinz Buchegger (kbuchegg) (Moderator)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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?

Autor: Dosmo (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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...

Autor: Karl Heinz Buchegger (kbuchegg) (Moderator)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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).

Autor: Thomas (Gast)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net