- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 7 von 7

Thema: HEX Daten mitels RS232 übertragen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    08.03.2010
    Beiträge
    66

    HEX Daten mitels RS232 übertragen

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    ich möchte an ein anderes Gerät via µC etwas senden. Was ich senden muss weiß ich. Ich weiß auch was ich bei erfolg als Antwort bekomme.

    Mein Problem ist wahrscheinlich etwas Grundlegendes.

    Ich verwende einen ATMega 644.
    Zum Testen sende ich die Daten an den PC.
    Dort wartet ein Datenlogger, der alles aufzeichnet.
    Um mein Problem etwas zu verdeutlichen muss ich etwas umschreiben.

    Ich habe eine Digi-Kamera welche sich von einem PC via RS232 fernsteuern lässt.
    Die Software auf dem PC sendet Befehle, die Kamera erhält diese und antwortet.

    Diese Kommunikation konnte ich mit dem Datenlogger mitschneiden.
    Daher weiß ich was übertragen werden muss.

    Hier zunächst ein Auszug als Beispiel:

    Request: 20.03.2011 21:05:14.07964
    00 .
    Answer: 20.03.2011 21:05:15.62664 (+0.5469 seconds)

    FF FF 15 ÿÿ.


    Links als HEX rechts als Char bzw. String

    Mein Versuch für`s erste also: Mit dem µC das 0x00 zu an den PC zu senden.
    Allein das klappt schon nicht. Es kommt nicht an.

    Ein Auszug meines Testprogramms:


    Code:
    #define UART_BAUD_RATE 19200L
    #define UART_BAUD_CALC(UART_BAUD_RATE,F_CPU) ((F_CPU)/((UART_BAUD_RATE)*16L)-1L) 
    
    
    void USART_putc(uint8_t byte)
    {
    while(bit_is_clear(UCSR0A,UDRE0)); //warten auf Datenregister empty
    UDR0=byte;
    }
    
    
    void USART_puts(char *s)
    /* print string on USART (no auto linefeed) */
    {
    while (*s!=0) 
        {
        USART_putc(*s);
        s++;
        }
    }

    Ich habe sowohl USART_puts als auch USART_putc probiert.
    Das eine sendet Char, das andere sendet Bytes.

    Das sah aus wie folgt:
    USART_puts(0x00);
    und
    USART_putc(0x00);

    Bei beidem hat der Datenlogger nicht wie erwartet:
    Request:
    00



    angezeigt, sondern gar nichts.


    Dann wollte ich mal etwas längeres senden:

    //1B 53 06 00 00 11 02 00 00 00 13 00


    USART_puts(0x1B);
    USART_puts(0x53);
    USART_puts(0x06);
    USART_puts(0x00);
    USART_puts(0x00);
    USART_puts(0x11);
    USART_puts(0x02);
    USART_puts(0x00);
    USART_puts(0x00);
    USART_puts(0x00);
    USART_puts(0x13);
    USART_puts(0x00);

    Ich habe es auch hier mit USART_puts und USART_putc probiert.
    Der Logger hat zwar etwas angezeigt, aber eben nicht das was ich gesendet habe.

    Wer jetzt denkt das die schnittstelle nicht funktioniert, dem ist nicht so.

    Wenn ich das hier mache:
    USART_puts("Hello");

    klappt es.


    Soviel zur "Vorgeschichte".

    Ich habe da also einen gewaltigen Denkfehler drin.

    Bleiben wir bei den genannten Beispielen.

    Was muss ich nun tun um das hier:

    00

    oder das hier

    1B 53 06 00 00 11 02 00 00 00 13 00

    zu senden?

    Wer kann mich darüber etwas aufklären?

    Gruß, Andreas

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.04.2010
    Beiträge
    1.249
    Und deine Hardware ist korrekt?!

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    08.03.2010
    Beiträge
    66
    Muss ja.

    Wenn ich

    USART_puts("Hello");

    sende, schreibt der Datenlogger:

    Answer:
    48 65 6C 6C 6F Hello





    ###########EDIT###########

    Habe gerade nochmal einen weiteren Test gemacht.

    Das Sende ich:
    1B 53 06 00

    Und das kommt an:
    Answer:
    1B 53 06 .S.


    Es fehlt also das 0x00 am Ende.
    Das ist ein Fortschritt, beim letzten Test kam etwas ganz anderes dabei herum. Evtl. könnte das damit zusammenhängen das ich es so gesendet habe:
    USART_puts("Hello");
    USART_putc(0x1B);
    .
    .
    .

    Er hat vielleicht das "Hello" mit dem Rest verknüpft.
    Wie auch immer, nun muss ich es hin bekommen das er das 0x00 nicht verschluckt.
    Vielleicht fehlt da noch etwas. Irgendwas zum terminieren, vielleicht?


    Weitere Tests ergaben, das er die 0x00 immer verschluckt. Egal ob ich es zu Beginn sende oder mitten drin.
    Selbst wenn ich das 10mal hintereinander sende kommt keines davon an. Die anderen Werte werden nun problemlos übertragen.
    Hat jemand eine Idee, wieso die 0x00 nicht übertragen werden?
    Geändert von MechMac (24.03.2011 um 20:20 Uhr)

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.04.2010
    Beiträge
    1.249
    Ok, hab den einen Satz überlesen.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    29.08.2008
    Beiträge
    73
    Hallo,

    in deinem Programm steht doch
    Code:
    while (*s!=0) { USART_putc(*s); s++; } }
    (vlt erklärt mir iwann mal wer wich ich dies Codefenster erzeuge)


    das bedeute es soll gesendet werden bis die \0 (Nullterminierung) gefunden wird. Aber wie der Name sagt ist \0 = 0x00

    Da du versuchst deine Abbruchbedingung zu senden klappt des nich.
    Ich hoffe du verstehst was ich meine.

    MfG Elchi
    Geändert von PicNick (25.03.2011 um 09:07 Uhr)

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    08.03.2010
    Beiträge
    66
    Hallo,

    nicht ganz.
    Schau mal auf die beiden Proceduren.

    Ein String wird in USART_puts "zerstückelt" und byteweise durch USART_putc versendet.
    Dieses herausfiltern der Nullterminierung greift also nur, wenn ich USART_puts auch nutze.

    Die HEX-Werte sende ich aber Byteweise direkt mit USART_putc.

    Gruß

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    29.08.2008
    Beiträge
    73
    Ok ich war wohl zu Erfreut auch mal wem helfen zu können, das ich zu schnell gerschrieben hatte. Ich teste demnächst mal was passiert wenn ich 0x00 zu senden versuche. Allerdings sende ich über die USART in dem ich das Byte in das entsprechende Register schreibe.

    Code:
    void send_byte(unsigned char send)
    {
        while ( (~(UCSRA)) & (1 << UDRE) );
    
        //Senden des bytes
        UDR = send;
    }
    So sende ich ein Byte vlt hilft dir das.
    Geändert von ElchiMtr (25.03.2011 um 21:14 Uhr) Grund: Codefenster eingefügt

Ähnliche Themen

  1. Daten von PC an uC übertragen
    Von sebi87 im Forum Software, Algorithmen und KI
    Antworten: 8
    Letzter Beitrag: 13.05.2010, 15:34
  2. Über C-Konsolenanwendung Daten über RS232 übertragen
    Von WDragon91 im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 03.07.2008, 19:23
  3. Daten per SPI/ISP an PC übertragen.
    Von wagneth im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 16.10.2007, 08:54
  4. Wireless Daten übertragen
    Von methusalem im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 23.02.2006, 13:36
  5. daten mit spi von avr zu avr übertragen
    Von pebisoft im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 21.10.2005, 14:49

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad