-
        

Ergebnis 1 bis 5 von 5

Thema: Serieller Datenempfang C# / AVR-GCC

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.266

    Serieller Datenempfang C# / AVR-GCC

    Anzeige

    Hallo,
    mir gehen langsam die Ideen aus warum bei meiner seriellen Datenübertragung mit 2 Xbee Modulen, jeweils 1 Byte falsch auf der PC Seite ankommt, wenn ich vom Roboter Daten versende.

    Mein Code auf Roboterseite ist:
    Code:
    void SendDataPackage(uint8_t Identifier, uint16_t value)
    {	
    	USART1_Transmit(_StartCond); //Das hier kommt richtig an
    
    	USART1_Transmit(Identifier); //Das hier kommt richtig an
            //value zerlegen
    	uint8_t highB = (uint8_t)(value >> 8);	
    
    	uint8_t lowB = (uint8_t)value;
    
    	USART1_Transmit(lowB); //Das hier kommt FALSCH an
    
    	USART1_Transmit(highB); //Das hier kommt richtig an
    
    	USART1_Transmit(_EndCond); //Das hier kommt richtig an
    
    }
    Auf PC Seite:
    Code:
            void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                Debug.WriteLine("Recieved Event ausgeführt");
    
                foreach (byte item in serialPort.ReadExisting())
                {
                    Debug.WriteLine(item); //Hier werden alle empfangenen Bytes ausgegeben
                }
                //Mache was mit den Daten
            }
    Wie im oberen Code bereits kommentiert kommt das Identifier - Byte, das _StartCond - Byte, das _EndCond - Byte und das hByte richtig an.
    Beim lByte jedoch wird immer 63 empfangen.

    Meine Serialport Einstellungen sind:
    8 Datenbits
    1 Stopbit
    NoParity
    Baudrate : 115200
    Verwunderlich ist das ganze für mich zudem, da Daten vom PC zum Roboter richtig übertragen werden.

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.266
    Ich weiß ja, dass das Pushen eines Threads sich nicht gehört. Ich machs jetzt aber trotzdem.

    Hat wirklich niemand eine Idee woran das liegen könnte ?

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.04.2010
    Beiträge
    1.249
    Hast es mal mit HTerm probiert?

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    26.08.2006
    Beiträge
    84
    Mahlzeit!

    3 Schüsse ins Blaue:

    1. Timing Problem?
    Code:
    void SendDataPackage(uint8_t Identifier, uint16_t value) {   
       // --- value zerlegen
       uint8_t highB = (uint8_t)(value >> 8);   
       uint8_t lowB = (uint8_t)value;
    
       // --- senden
       USART1_Transmit(_StartCond); //Das hier kommt richtig an
       USART1_Transmit(Identifier); //Das hier kommt richtig an
       USART1_Transmit(lowB); //Das hier kommt FALSCH an
       USART1_Transmit(highB); //Das hier kommt richtig an
       USART1_Transmit(_EndCond); //Das hier kommt richtig an
    }
    2. Konvertierungsproblem?
    Code:
    void SendDataPackage(uint8_t Identifier, uint16_t value) {   
       // --- value zerlegen
       uint8_t lowB = (uint8_t) (value & 0xff);
       uint8_t highB = (uint8_t) (value >> 8);   
    
       // --- senden
       USART1_Transmit(_StartCond); //Das hier kommt richtig an
       USART1_Transmit(Identifier); //Das hier kommt richtig an
       USART1_Transmit(lowB); //Das hier kommt FALSCH an
       USART1_Transmit(highB); //Das hier kommt richtig an
       USART1_Transmit(_EndCond); //Das hier kommt richtig an
    }
    3. Übertragung mit enm bekannten Testbyte (Timing die 2.)?
    Code:
    void SendDataPackage(uint8_t Identifier, uint16_t value) {   
       // --- value zerlegen
       uint8_t lowB = (uint8_t) (value & 0xff);
       uint8_t highB = (uint8_t) (value >> 8);   
    
       // --- senden
       USART1_Transmit(_StartCond); //Das hier kommt richtig an
       USART1_Transmit(Identifier); //Das hier kommt richtig an
       USART1_Transmit(0xaa); //Das hier kommt FALSCH an
       USART1_Transmit(highB); //Das hier kommt richtig an
       USART1_Transmit(_EndCond); //Das hier kommt richtig an
    }
    Ich bau mir fürs Senden per UART immer einen Puffer:
    Code:
    uint8_t txbuffer[5];
    
    void SendDataPackage(uint8_t Identifier, uint16_t value) {   
       // --- value zerlegen
       txbuffer[2] = (uint8_t) (value & 0xff);
       txbuffer[3] = (uint8_t) (value >> 8);   
    
       // --- frame bauen
      txbuffer[0] = _StartCond;
      txbuffer[1] = Identifier;
      txbuffer[4] = _EndCond;
    
       // --- senden
       send_txbuffer(5);
    }
    
    void send_txbuffer(uint8_t len) {
       for (uint8_t i=0;i<len;i++) {
          USART1_Transmit(txbuffer[i]);
       }
    }
    Da die USART einen Int wirft wenn der TX Puffer der USART leer ist, kann man dann den Puffer schön in einer int routine rausschreiben und derweil was anderes sinnvolles tun Und im PC kommt alles schön auf einmal an, da die Bytes am Stück geschrieben werden.

    Viel Glück

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.266
    Vielen Dank für die vielen Tipps. Leider werd ich erst die nächsten Tage zum ausprobieren kommen, da ich erst meinen Entwicklungs-PC wieder zusammen schrauben muss, so dass er läuft ^^

Berechtigungen

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