Спасибо что разъяснили, хотя над сдвигом еще придется голову поломать
Набросал себе такой хидер для удобства, точнее украл с avrfreaks
Код
#define SETBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
#define FLIPBIT(ADDRESS,BIT) (ADDRESS ^= (1<<BIT))
#define GETBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT))
#define BITWRITE(c,p,m) (c ? SETBIT(p,m) : CLEARBIT(p,m))
на первое время я думаю покатит, все же лучше чем сдвиги самому продумывать
А вот кольцевой буфер идею которого я нашел где-то в гугле
Правда работать не хочет... и несколько отличается от того, что мне писали здесь, вместо указателейц используется побитовая маска, идею которой я, дурак, так и не понял
В статье писали что лучше всего использовать такой буфер в размерности 256, при этом битовую маску задавать одним байтом... может кто пояснит, спасибо.
Код
#define RXBUF_SIZE 16 //размер буфера обязательно равен степени двойки!
#define RXBUF_MASK (RXBUF_SIZE-1)
#define BLOCK_TIMEOUT 10
#define BYTE_TIMEOUT 10
#define BLOCK_SIZE 8
unsigned char rxbuf[RXBUF_SIZE];
unsigned char inrx, outrx;
unsigned char rxtimeout = 0;
unsigned char idxDiff(unsigned char idxIN, unsigned char idxOUT, unsigned char bufsize)
{
if (idxIN >= idxOUT){
return (idxIN - idxOUT);
FLIPBIT(PORTB,0);
}
else{
return ((bufsize - idxOUT) + idxIN);
FLIPBIT(PORTB,1);
}
}
//программка отслеживает прием и его таймауты, и в зависимости от приема
// сбрасывает буфер либо переключает режим работы. Подпрограмма должна
// вызываться в бесконечном цикле main.
void usartPool (void)
{
char value;
unsigned char rxcnt = idxDiff (inrx, outrx, RXBUF_SIZE);
if (0 == rxcnt)
{
//в буфере ничего нет
if (rxtimeout >= BLOCK_TIMEOUT)
{
//в буфере ничего нет давно
//...
}
}
else if (rxcnt < BLOCK_SIZE)
{
//в буфере что-то есть, но мало
if (rxtimeout >= BYTE_TIMEOUT)
{
//прошла слишком большая пауза между байтами,
// сбрасываем буфер приема
outrx = inrx;
}
}
else
{
//в буфере корректно приняты BLOCK_SIZE байт,
// обрабатываем данные
//...
do{
value = rxbuf[outrx++];
while ( !( UCSR0A & (1<<UDRE0)) ) UDR0 = value;
outrx &= RXBUF_MASK;
}
while(inrx!=outrx);
}
}
int main (void)
{
USART_Init(BAUD_PRESCALE);
sei();
for(;;) // Loop forever
{
usartPool();
}
}
ISR(USART_RX_vect)
{
char ReceivedByte;
ReceivedByte = UDR0; // Fetch the recieved byte value into the variable "ByteReceived"
//while ( !( UCSR0A & (1<<UDRE0)) )
UDR0 = ReceivedByte; // Echo back the received byte back to the computer
rxbuf[inrx++] = ReceivedByte;
inrx &= RXBUF_MASK;
rxtimeout = 0;
FLIPBIT(PORTB,0);
}