PIC24 und Circular Buffer

Gast #2786803
Lesenswert?
• ▲
▼
Hello,
Weren dem TX mit UART 2 habe ich eine OERR bekommen. Ich habe die flags 
zuruck gesetzt. Aber nach die TX kommt eine RX Interrut getriggerd. Da 
sehe ich das ein paar chars sind immer verschoben. Ich denke es ist 
wegen die circular buffer zu tun im Uart RX Reg.

// DATA TRANSMISSION

void putstring_U2(Buffer * buf)
{
   char ch;
    int i = 0;
    U2STAbits.UTXEN = 1;
    disable_U2_RX();
    clear_U2_RX_BUF(U2_RX_BUF, sizeof(U2_RX_BUF));
    do
    {
      // transmit until CR or buffer empty
    if(i < buf->len)
      {
        ch = buf->data[i];
        // wait while Tx buffer full
        while ( IS_TRANSMIT_BUFFER_FULL_UART2());
      U2TXREG = (unsigned char)ch;
        i++;
    }
  }while(ch != CR);
  ch = U2RXREG;    // Reset the read buffer
  U2STAbits.OERR = 0;  // reset over run eror
  IFS4bits.U2ERIF = 0; // reset the flags
  enable_U2_RX();   // Enable reception
  dataReceived = false;
} // putChar_U2

// DATA RECEPTION


// wait for a new character to arrive to the UART2 serial port
char getChar_U2( void)
{
  while ( !IS_CHAR_READY_UART2());  // wait for a new character to 
arrive
  //U2_RTS = 1;
  IFS1bits.U2RXIF = 0;
  return U2RXREG;    // read the character from the receive buffer
}// getcharUART


void getstring_U2( char *u2s, int len)
{
  U2STAbits.UTXEN = 0;
  unsigned int cr_count = 0;
    do{
        *u2s = getChar_U2();       // wait for a new character
        if ( *u2s==0x0A)
        {cr_count++;}            // line feed, end loop
        if ( cr_count==2)
        {break;}
        u2s++;                // increment buffer pointer
        len--;
    } while ( len>1 );      // until buffer full
} // getstring_U2


void _attribute_ ((interrupt,no_auto_psv)) _U2RXInterrupt(void)
 {
    // disable further RX Interrupt
   // disable_U2_RX();
   // Check for over run error
     if( U2STAbits.OERR )           // if overrun, clear OERR flag
         U2STAbits.OERR = 0;        // according to datasheet paragraph 
16.5
  // Deal with the data here
   getstring_U2(U2_RX_BUF, sizeof(U2_RX_BUF));
   disable_U2_RX();
   dataReceived = true;  // Process the received data in Main
 }



Kann jemand mir helfen.. wie kann ich lessen.. genau wie es rein kommt 
im entsprechend array stelle..?! z.b.   U2_RX_BUF[0]  hatt immer die 
erste char was die U2RXREG bekommen hatt nach die interrupt !?

vielen dank
Savio

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.