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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.