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.