Hallo zusammen,
ich habe folgendes Problem und stehe im Moment ein wenig auf der
Leitung...
Ich habe 8 Byte Daten. In Hex würden die nur mal als Beispiel wie folgt
aussehen.
88 77 66 55 44 33 22 11
Nun wollte ich diese Daten so vom µC per RS232 an den PC senden und in
einem Terminal Programm ausgeben, so wie es oben steht. Wenn ich die
Daten einfach so sende, wird nur Mist angezeigt, klar, weil die Werte
falsch interpretiert werden, bzw nicht so, wie ich das möchte. Ich
müsste die Daten ja in einen String umwandeln, um es dann zu senden. Das
ganze müsste dann in Hex doch so aussehen 38 38 für angezeigte 88 im
Terminalprogramm. Richtig?
Allerdings komm ich nicht drauf, wie ich das ganze entsprechend
umwandle. Wäre klasse, wenn mir da jemand auf die Sprünge helfen könnte.
Vielen Dank.
Grüße
Sebastian
Hallo,
vielen Dank erst einmal, aber irgendwie gibt mein Kompiler keine
Funktion utoa oder ähnliches her, nur in umgekehrter Richtung. Ich
verwende einen Kompiler von Cosmic für einen HC12 von Freescale.
Hat jemand vielleicht eine andere Lösung oder schon einmal eine eigene
Funktion geschrieben oder so?
Vielen Dank!
Grüße
Sebastian
Ich schätze, utoa reicht eh nicht, weil
a) Kleinbuchstaben gewandelt werden (mag akzeptabel sein)
b) Vornullen unterdrückt werden
Leider werden solche Details aus dem Beispiel nicht deutlich.
Mache folgendes:
Schreib eine Routine, die einen Nibble (=ein Hex-Zeichen) sendet:
void SendNibble(unsigned char Nibble)
{
// Preserve range
Nibble &= 0x0F;
uart_putchar(Nibble <= 9 ? '0'+Nibble : 'A'+Nibble-10);
}
Und eine Routine zum Byte senden:
void SendByte(unsigned char Byte)
{
// Send upper nibble
SendNibble(Byte >> 4);
// Send lower nibble
SendNibble(Byte);
}
Feddisch. Da mögen jetzt noch Compilerfehler drin sein ;-)
Hallo,
ich habe das genze nun mit printf gelöst. Allerdings habe ich noch ein
Problem dabei. Ich habe z.B. die Hex-Werte 11 22 33 44 55 66 77 88,
geseichert in
CAN0TXFG[4]....CAN0TXFG[11]
1
for(ii=0;ii<8;ii++)
2
{
3
zahl=CAN0TXFG[ii+4];
4
Send(printf("%x",CAN0TXFG[ii+4]));
5
}
Allerdings stimmt die Ausgabe dabei nicht. Es kommt raus:
0 22 33 44 55 66 77 88
Egal was ich mache und ausgeben lasse, der erste Wert ist immer die
0...sollte in diesem Fall eigentlich eine 11 sein. Egal was ich mache,
es wird als erstes immer eine 0 ausgegeben beim ersten
Schleifendurchlauf. Hat jemand eine Idee, woran das liegen könnte oder
was ich falsch mache?
Vielen Dank!
Grüße
Sebastian
Hallo,
ja, das habe ich soweit, ich habe nur das Problem, dass wenn ich nun
mein Array wie oben angegeben in einer Schleife ausgebe, ist der erste
Wert immer 00 egal ob da 0x11, 0x22, 0x99 drin steht. Beim ersten
Schleifendurchlauf wird immer 00 ausgegeben. Ich habe nun einmal die
Schleife durch 8 Zeilen der Art PutStSCI0(printf("%02X", CAN0TXFG[4]));
ersetzt CAN0TXFG[4]...CAN0TXFG[11]. der erste Wert ist immer 00. Wenn
ich dann die Reihenfolge der Ausgabe ändere, ist immer der erste Wert
der ausgegeben wird 00.
CAN0TXFG[4]...CAN0TXFG[11] -> 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88
Ausgabe 00 22 33 44 55 66 77 88
CAN0TXFG[5]...CAN0TXFG[11]CAN0TXFG[4]
0x22 0x33 0x44 0x55 0x66 0x77 0x88 0x11
Ausgabe 00 33 44 55 66 77 88 11
Jemand eine Idee, was das sein könnte?
Vielen Dank!
Grüße
Sebastian
Hallo,
mit sprintf erhalte ich gar keine Ausgabe.
Hier mal der Codeschnipsel...
1
PutStSCI0(printf("%02X",CAN0TXFG[5]));// 0x22
2
PutStSCI0(printf("%02X",CAN0TXFG[6]));// 0x33
3
PutStSCI0(printf("%02X",CAN0TXFG[7]));// 0x44
4
PutStSCI0(printf("%02X",CAN0TXFG[4]));// 0x11
5
PutStSCI0(printf("%02X",CAN0TXFG[8]));// 0x55
6
PutStSCI0(printf("%02X",CAN0TXFG[9]));// 0x66
7
PutStSCI0(printf("%02X",CAN0TXFG[10]));// 0x77
8
PutStSCI0(printf("%02X",CAN0TXFG[11]));// 0x88
9
/*for(ii = 0; ii < NumBytes; ii++)
10
{
11
zahl = CAN0TXFG[ii+4];
12
PutStSCI0(printf("%02X", CAN0TXFG[ii+4]));
13
}*/
Die Ausgabe ist aber: 00 33 44 11 55 66 77 88 Egal in welcher
Reihenfolge das ganze ausgegeben wird, die erste Ausgabe ist immer 00!!!
>Wie wäre es hiermit, ohne printf etc. und für ein Byte:>>uint8_t n2hex(uint8_t val)>{> if (val > 9){> return val + 'A' - 10;> }> else{> return val + '0';> }>}>>void byte2hex(uint8_t val,char *str)>{> *str++ = n2hex(val >> 4);> *str = n2hex(val & 0x0f);>}>>...>>byte2hex(byte_wert, s);
..-> noch nicht getestet...
Vielen Dank!
Grüße
Sebastian
Hallo Sebastian,
Könnte es sein, dass Du nach dem Einschalten der
Betriebsspannung gleich anfängst über RS232 zu
senden? Denk dran, dass der MAY232 eine Zeit braucht,
bis die Ladungspumpen die Spannungen aufgebaut haben.
Mach doch mal einen richtig langen delay bevor Du
anfängst zu senden. Ruhig 1,2,3... Sekunden.
Hallo,
> Könnte es sein, dass Du nach dem Einschalten der> Betriebsspannung gleich anfängst über RS232 zu> senden?
Ich sende schon voher Text. Der wird einwandfrei übertragen.
Ich habe mal folgendes probiert:
1
zahl=170;// 0xAA
2
PutStSCI0(printf("%02X",zahl));
3
PutStSCI0(printf("%02X",CAN0TXFG[4]));// 0x11
4
PutStSCI0(printf("%02X",CAN0TXFG[5]));// 0x22
5
PutStSCI0(printf("%02X",CAN0TXFG[6]));// 0x33
6
PutStSCI0(printf("%02X",CAN0TXFG[7]));// 0x44
7
PutStSCI0(printf("%02X",CAN0TXFG[8]));// 0x55
8
PutStSCI0(printf("%02X",CAN0TXFG[9]));// 0x66
9
PutStSCI0(printf("%02X",CAN0TXFG[10]));// 0x77
10
PutStSCI0(printf("%02X",CAN0TXFG[11]));// 0x88
Dabei sieht die Ausganbe dann wie folgt aus:
AA 11 22 33 44 55 66 77 88, also so, wie es sein soll. Nehme ich
PutStSCI0(printf("%02X", zahl)); wieder raus gehts wieder so los 00 22
33 44....
Grüße
Sebastian
Sebastian wrote:
> Dabei sieht die Ausganbe dann wie folgt aus:> AA 11 22 33 44 55 66 77 88, also so, wie es sein soll. Nehme ich> PutStSCI0(printf("%02X", zahl)); wieder raus gehts wieder so los 00 22> 33 44....
Zeig mal mehr Code (am besten ein vollständiges kleines(!) Programm,
welches den Fehler zeigt). Aus dem Snippet kann man nicht wirklich was
entnehmen.
CAN0TXFG[12]=NumBytes;// Set Number of Bytes to send
19
// Data Lenght Register (DLR); Site 42
20
NACAN=CAN0TBSEL;
21
CAN0TFLG=NACAN;// Start transmission
22
zahl=170;
23
PutStSCI0(printf("%02X",zahl));
24
/*PutStSCI0(printf("%02X", CAN0TXFG[4]));
25
PutStSCI0(printf("%02X", CAN0TXFG[5]));
26
PutStSCI0(printf("%02X", CAN0TXFG[6]));
27
PutStSCI0(printf("%02X", CAN0TXFG[7]));
28
PutStSCI0(printf("%02X", CAN0TXFG[8]));
29
PutStSCI0(printf("%02X", CAN0TXFG[9]));
30
PutStSCI0(printf("%02X", CAN0TXFG[10]));
31
PutStSCI0(printf("%02X", CAN0TXFG[11]));*/
32
for(ii=0;ii<NumBytes;ii++)
33
{
34
zahl=CAN0TXFG[ii+4];
35
PutStSCI0(printf("%02X",zahl));
36
}
37
PutStSCI0(" OK\n");
38
}
Das ganze gehört zu einem Projekt in dem es unter anderem um CAN geht.
Mit der obigen Funktion werden eben CAN-Botschafen gesendet. Das
funktioniert auch prima. Weiter sollen halt bestimmte Daten über RS232
an den PC gesendet werden, in diesem Fall eben die per CAN gesendeten
Daten.
So wie es oben steht funktioniert das ganze. die ausgabe sieht dann wie
folgt aus:
AA 11 22 33 44 55 66 77 88 (die AA kommen aus der zahl= 170; der Rest
ist eben in CAN0TXFG[4]...CAN0TXFG[11] gespeichert.
Wenn ich nun die Zeile "PutStSCI0(printf("%02X", zahl));"
auskommentiere, sieht die Ausgabe wie folgt aus: 00 22 33 44 55 66 77
88.
Alle anderen Textausgaben usw. funktionieren einwandfrei. Werte im Array
habe ich mehrfach überprüft. Die stimmen, also sind z.B. 11 auch wenn
die 00 ausgegeben wird. Das ganze stimmt nur, wenn vor der eigentlichen
Ausgabe schon was mit PutStSCI0(printf("%02X", zahl)); ausgegeben wird.
Grüße
Sebastian
OK.
Ich kann aus dem Codeschnipsel immer noch nicht erkennen, ob CAN0TXCFG
korrekte Werte enthält oder nicht, ob du das Array überläufst oder
nicht, etc.
Aber seis drum.
WO hast du eigentlich diesen Schwachsinn her
PutStSCI0(printf("%02X", zahl));
printf dazu einzusetzen, einen temporären String aufzubauen, der von
printf verwaltet wird, ist ja wohl mehr als gefährlich. Ausserdem stimmt
der Return Wert von printf nicht. Alles in allem, sollte man dir dafür
alleine schon einen nassen Fetzen um den Kopf schlagen :-)
Eine Stringausgabe kann man sich zb so vorbereiten
char Buffer[20];
sprintf( Buffer, "%02X", zahl );
jetzt hast du in Buffer einen String, den du mit der Stringausgabe
ausgeben kannst:
PutStSCI0( Buffer );
Die Ausgabe hierbei ist AA1122334455667788.
Lässt man hier die Zeilen vor der Schleife weg, ergibt sich die folgende
Ausgabe: 001122334455667788.
Dies sind die Daten, die gesendet werden sollen, diese werden ja an die
obige Funktion übergeben:
Sebastian wrote:
> Lässt man hier die Zeilen vor der Schleife weg, ergibt sich die folgende> Ausgabe: 001122334455667788.
mysteriös. (und ich mein das wirklich nicht ironisch)
Bei solch mysteriösen Dingen ist es oft so, dass der eigentliche Fehler
ganz woanders steckt und du nur die Auswirkungen siehst. Wird dir wohl
nichts anderes übrig bleiben, als abspecken, abspecken, abspecken, bis
der Fehler verschwindet. Die Wahrscheinlichkeit ist hoch, dass der
eigentliche Fehler im zuletzt abgespeckten Bereich war. Fehler
korrigieren und das abgespeckte (=auskommentierte) wieder stückchenweise
freigeben und Ausschau nach sonstigen ungewöhnlichen Effekten halten.
Sebastian wrote:
> das Programm ist zu umfangreich, um es hier alles anzugeben. Die> Funktion, in der das ganze ablaufen soll, ist folgende:
Dann reduziere es. So geht das nunmal beim Debugging.
>Einige Varianten von printf können das auch.
Das printf monster ist nicht totzukriegen. Wenn man das in ein
embedded projekt hinzulinkt kann man gleich den Strick bestellen...
Hallo,
> Das printf monster ist nicht totzukriegen. Wenn man das in ein> embedded projekt hinzulinkt kann man gleich den Strick bestellen...
Andere Vorschläge?
Ich glaube, ich habe den Fehler gefunden. Es liegt anscheinend daran,
dass ich die Daten vorher schon einmal verarbeite/verwende. Ich verwende
nun nicht die Register CAN0TXFG[ii+4] usw. sondern direkt *TXBuf++.
Damit funktioniert es nun.
Vielen Dank!
Grüße
Sebastian
>Kann das einer der C Cracks noch kleiner/schneller machen?
out[1] = (i & 15)<10?(i & 15) + '0':(i & 15) + 'A'
out[0] = (i & 240)>>4)?(i & 240)>>4) + '0':(i & 240)>>4) + 'A'
out[2] = '\0';
Bei schneller bin ich mir nicht sicher, kommt auf den optimieren an,
eventuell mit hilfsvariable machen.
Peter (Gast) schrieb:
> out[1] = (i & 15)<10?(i & 15) + '0':(i & 15) + 'A'> out[0] = (i & 240)>>4)?(i & 240)>>4) + '0':(i & 240)>>4) + 'A'> out[2] = '\0';
Ja, der Fred ist schon etwas älter ... aber da mir dieser Codeschnipsel
hier am meisten weiter geholfen hat - obwohl er so nicht funktioniert -,
nachfolgend nochmal die leicht bearbeitete Version für's Protokoll.
Zum Ursprungsproblem:
>Nun wollte ich diese Daten so vom µC per RS232 an den PC senden>und in einem Terminal Programm ausgeben, (...)
Dann solltest du ganz einfach ein Terminalprogramm nehmen, welches
konfiguriert werden kann, alle ankommenden Bytes (0x00 ... 0xFF)
als jeweils 2 Asciizeichen + nachfolgendes Leerzeichen darzustellen.
Lies mal hier weiter
Beitrag "Neues Terminal-Programm für Windows"
bzw.
http://www.der-hammer.info/terminal/index.htm