- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 8 von 8

Thema: Ascii2Hex UART Problem

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    11.05.2005
    Beiträge
    9

    Ascii2Hex UART Problem

    Anzeige

    Praxistest und DIY Projekte
    Ave AVR-Freunde!

    Ich hab' ein kleines Problemchen,

    müsste mal mit Terminal Zahl in zwei Formaten an den UART übergeben können, und damit weiter im µC rechnen.

    Format I: hh hh hh also z.B. F9540F auf dem µC: 0xF9, 0x54, 0x0F
    Format II: hhh also z.B. 7E0 - auf dem µC: 0x00, 0x07, 0xE0

    Also am Terminal soll man einfah 7e0 eintippen dann läuft es als ASCII mit UART an den µC, wird als String zusammengesetzt und....

    ...und hier benötige ich Eure Hilfe. Könnte mir jemand sagen wie so eine Funktion aussehen könnte?

    Eine lib wegen einer Funktion einzubinden würde ich ungeren tun, zumal ich nicht mal weiss welche es sein könnte...

    Grüsse

    Robinsam.


    PS. Beim kompilieren zeigt mir WinAVR Program: 17,6% Full und 2758 Bytes. Die Datei hat aber 8K im Explorer.... (Genau 7.778 Bytes). Was beinhaltet sie noch?

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Das ist eine Routine nur zum Verständnis. davon geht vieles besser und kürzer.
    Code:
    unsigned uint32_t  Data; 
    char ink;
    Data = 0;   // initialize
    
    
    one-data-in:
             ink = UDR;
            Data <<= 4;         
             switch (ink)
            {
            case 13:      break;   // <RETURN> fertig
            case 'A':      Data |= 0x0A;    break;      
            case 'B'       Data |= 0x0B;    break;      
            case 'C':      Data |= 0x0C;    break;       
            case 'D':      Data |= 0x0D;    break;       
            case 'E':      Data |= 0x0E;    break;       
            case 'F':      Data |= 0x0F;    break;       
            case '0':      Data |= 0x00;    break;       
            case '1':      Data |= 0x01;    break;       
        ..................
            case '9':      Data |= 0x09;    break;       
           default:                                break;
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    11.05.2005
    Beiträge
    9
    Recht herzlichen Dank für die Antwort... Und vor allem so schnell...

    Zu der Rutine... Vielleicht ist mir was entgangen, aber ist es nicht so, dass, wenn ich "70e" schreibe und dann ENTER drücke bekome ich "70e0"? Soll aber "070e" kommen.. und das ist mein Problem... Oder habe ich da was nicht verstanden?

    Trotzdem herzlichen Dank, und falls ich im Unrecht sein sollte, bitte nicht schreien .

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Du hast recht. Das shiften von DATA darfst du erst machen, wenn ein gültiges Zeichen erkannt wurde
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    11.05.2005
    Beiträge
    9
    Danke Rob, aber auch das hilft nicht so ganz....
    dann hätte ich aus "f2b" "f20b" statt "0f2b"...
    Ich habe mir da was gebastellt, aber es ist leider sehr lange mit String-Kopiererei, und offset-verschiebung ...

    Obwohl diesen Part mit dem Zeichen-Ersatz statt offset-rechnerei könnte ich schon von Dir übernehmen... Das versuche ich.

    Thx.

    auch robert

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Moment: Input "F2B"
    Code:
    1 ------------------------------
    Data = 00000000
    inpc = "F"             uppercase beachten ! 
    Shift Data = 00000000
    Data OR inpc = 0000000F
    2 ------------------------------
    Data = 0000000F
    inpc = "2"      
    Shift Data = 000000F0
    Data OR inpc = 000000F2
    3 ------------------------------
    Data = 000000F2
    inpc = "B"      
    Shift Data = 00000F20
    Data OR inpc = 00000F2B
    4 ------------------------------
    Data = 00000F2B
    inpc = <ENTER>      
    nix
    Data = 00000F2B
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Zitat Zitat von Robinsam
    Beim kompilieren zeigt mir WinAVR Program: 17,6% Full und 2758 Bytes. Die Datei hat aber 8K im Explorer.... (Genau 7.778 Bytes). Was beinhaltet sie noch?
    Neben dem reinen Code sind noch andere Informationen in der Binärdatei -- unterschiedlich je nachdem, auf welches Format du dich beziehst (elf, ihex, bin, srec,...) Es können etwa Debug-Informationen drinne sein, die ja nicht auf dem Flash/EEPRIOM landen.

    Wenn's auf Codegrösse ankommt, ist wohl so was am knackigsten, ohne viel zu hacken:
    Code:
    ...
       data <<= 4;
       uint8_t offset = 0;
    	
       switch (ink)
    	{
    		case '0' ... '9': 
    			offset = '0'; 
    			break;
    		case 'A' ... 'F':
    			offset = 'A'-10;
    			break;
    			
    		case 'a' ... 'f':
    			offset = 'a'-10;
    			break;
    			
    		case 10:	
    		case 13:	
    			break;
    		default:
    			// ???
    			break;
    	}
    	
    	data += ink-offset; 
    ...
    Disclaimer: none. Sue me.

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    11.05.2005
    Beiträge
    9
    Ich danke Euch beiden für den Einsatz. Genau das, was ich mir gewünscht hatte.

    @PicNic
    Recht hast Du... ich habe leider die Initialisierung übersehen... ... und bin von uint8_t ausgegangen....
    sorry.


    Nochmal danke.

    Robert

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests