http://rutube.ru/tracks/1028588.html?v=c5e...bfe97242aa66f18
Функция получения пакета вроде бы как давно проверена, много раз ее использовал, вот она
Код
interrupt [USART_RXC] void usart_rx_isr(void)
{
char data = UDR;
if (!rx_done) {
if (data == ':') fbp = 1;
if (fbp) {
rx_buffer[rx_wr_index++] = data;
if (data =='/') {
rx_done = 1;
fbp = 0;
rx_wr_index = 0;
activeCommand(rx_buffer);
}
else if (rx_wr_index>=RX_BUFFER_SIZE) {
rx_wr_index = 0;
rx_buffer_overflow = 1;
}
} else;
} else rx_data_overrun = 1;
}
void activeCommand(char c[])
{
USHORT a, b, d, e;
a=rx_buffer[1];
b=rx_buffer[2];
d=rx_buffer[3];
e=rx_buffer[4];
fi=a-48; //Так как преобразование идет в ASCII код приходится доводить значение
se=b-48;
th=d-48;
fo=e-48;
rx_done = 0;
}
{
char data = UDR;
if (!rx_done) {
if (data == ':') fbp = 1;
if (fbp) {
rx_buffer[rx_wr_index++] = data;
if (data =='/') {
rx_done = 1;
fbp = 0;
rx_wr_index = 0;
activeCommand(rx_buffer);
}
else if (rx_wr_index>=RX_BUFFER_SIZE) {
rx_wr_index = 0;
rx_buffer_overflow = 1;
}
} else;
} else rx_data_overrun = 1;
}
void activeCommand(char c[])
{
USHORT a, b, d, e;
a=rx_buffer[1];
b=rx_buffer[2];
d=rx_buffer[3];
e=rx_buffer[4];
fi=a-48; //Так как преобразование идет в ASCII код приходится доводить значение
se=b-48;
th=d-48;
fo=e-48;
rx_done = 0;
}
Шлю команду по прерыванию каждую секунду так
Код
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
PORTB=0x00;
TCNT1=57723;//57723
if (S!=59){
S++;
} else {
S=0;
M++;
}
if (M==60){
M=0;
H++;
}
if (H==24){
H=0;
}
SetCountCommand[1]=M/10+48;
SetCountCommand[2]=M%10+48;
SetCountCommand[3]=S/10+48;
SetCountCommand[4]=S%10+48;
puts(SetCountCommand);
}
{
PORTB=0x00;
TCNT1=57723;//57723
if (S!=59){
S++;
} else {
S=0;
M++;
}
if (M==60){
M=0;
H++;
}
if (H==24){
H=0;
}
SetCountCommand[1]=M/10+48;
SetCountCommand[2]=M%10+48;
SetCountCommand[3]=S/10+48;
SetCountCommand[4]=S%10+48;
puts(SetCountCommand);
}
Как видно из вышеприведенного все это прекрасно работает за исключением только того бага. Что это может быть и как это лечить?