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