AVR UART i problem z buforem rx

Mar 21, 2007 0 Replies

Podczas transmisji RS-232 AVR <-> Ericsson T68i, procek nie odbiera wszystkich znaków wysyłanych przez telefon.



Wysyłam: AT \n \r, telefon odpowiada: AT \n \r \n \r OK \r \n a w buforze odbiorczym mam tylko początek: AT \n \r \n \r ,gdzie reszta znaków ?



Gdzie robię ten czeski błąd ?



Oto kod programu.



#include <avr/io.h>



#include <avr/interrupt.h>



#include <string.h>



#include <util/delay.h>



// UART #define UART_ 9600 #define UART_BAUD (F_CPU/(16ul*UART_)-1) #define RXbufSize 50 #define TXbufSize 50



// STATUS #define fRXovl fStat.Bit.Flag1 // przepelnienie bufora RX #define fTXnow fStat.Bit.Flag2


typedef unsigned char u08;



typedef struct { u08 Flag1:1; u08 Flag2:1; u08 Flag3:1; u08 Flag4:1; u08 Flag5:1; u08 Flag6:1; u08 Flag7:1; u08 Flag8:1; } FlagBits;



typedef union { FlagBits Bit; u08 Byte; } Flags;


volatile Flags fStat; volatile u08 RXbuf[RXbufSize]; volatile int pRX=0, pTX=0; volatile int RXnum=0; u08 TXbuf[TXbufSize]; u08 tmp;


SIGNAL (SIG_UART_TRANS) { if(TXbuf[pTX] != '\0') UDR = TXbuf[pTX++]; else { UCSRB &= ~(1 << TXEN); fTXnow = 0; } }



SIGNAL (SIG_UART_RECV) { RXbuf[pRX++] = UDR; RXnum++;



if(pRX == RXbufSize) { pRX=0; fRXovl = 1; } }


void sendTxt(u08 *s) {



strcpy(TXbuf,s); tmp = strlen(s); TXbuf[tmp++] = '\n'; TXbuf[tmp++] = '\r'; TXbuf[tmp] = '\0';



while(fTXnow == 1) ;



pTX=0; fTXnow = 1;



UDR = TXbuf[pTX++]; }


void setup(void) { cli();



fStat.Byte = 0;



DDRA = 0xFF;



UBRRH = (u08)(UART_BAUD >> 8); UBRRL = (u08) UART_BAUD; UCSRC = (1 << URSEL) | (1 << UCSZ0) | (1<<UCSZ1); //8N1 UCSRB = (1<<RXEN) | (1<<TXEN) | (1 << RXCIE) | (1 << TXCIE);



sei(); }



int main(void) { _delay_ms(100);



setup();



sendTxt("AT");



while(1) ;



return 0; }


Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required