AVR UART i problem z buforem rx

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; }

Reply to
tomi
Loading thread data ...

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.