Do uartu przychodzą znaki. Algorytm ma za zadanie złożyć słowo ze znaków różnych od 0x0A (znak nowej linii).
Nic prostszego:
Myślę że kod jest banalny, lecz mimo to zachowuje się przedziwnie.
Jeśli wysyłam: abcde#010
Wtedy odbieram: abcde
Jeśli wysyłam: abcde#010#010
Wtedy odbieram: abcde+puste słowo
Jeśli wysyłam: abcde#010#010
Wtedy odbieram: abcde+puste słowo+puste słowo
Wszystko jest do tej pory ok. Jaja zaczynają się kiedy dam znak #010 (znak nowej linii zapisany dziesiętnie) z przodu.
Jeśli wysyłam: #010abcde#010
Wtedy odbieram: puste słowo+abcde+puste słowo
Tak jest jeszcze ok. A teraz jest najlepsze:
wysyłam: #010#010abcde#010
odbieram: puste słowo+puste słowo+ab (<--- gdzie uciekła reszta znaków?!)
wysyłam: #010#010#010abcde#010
odbieram: puste słowo+puste słowo+puste słowo+ae
wysyłam: #010#010#010#010abcde#010
odbieram: puste słowo+puste słowo+puste słowo+puste słowo+d
wysyłam: #010#010#010#010#010abcde#010
odbieram: puste słowo+puste słowo+puste słowo+puste słowo+c
Im więcej znaków #010 z przodu tym zachowanie programu dziwniejsze. Czy jest na to jakieś wyjaśnienie?
Uart napewno jest dobrze ustawiony. To samo dzieje się niezależnie od prędkości transmisji. efuse=0xFF (czyli kompatybilność z m103 wyłączona). wg. mnie po stronie 'fizycznej' jest wszystko ok. coś jest w programie ale jest on tak prosty że nie moge doszukać się sam błędu.
pomocy!
Dodano po 38 [minuty]:
odkryłem coś bardzo dziwnego. jak dodam linijke sprintf(buf,"%s",slowo0); to znaki są wysyłane normalnie (nic nie ginie) a puste słowa nie są tworzone.
Kompletnie nic już nie rozumiem..
Dodano po 12 [minuty]:
A jeszcze bardziej magiczne jest to że jak dam zamiast:
USART0_Transmit_Word(buf);
coś takiego:
USART0_Transmit_Word(slowo0);
to efekt jest taki sam. tak jakby sprintf modyfikował wejście a nie tylko wyjście..
Nic prostszego:
SIGNAL (USART0_RX_vect)
{
odebranyZnak0 = UDR0;
if (odebranyZnak0!=0x0A)
{
slowo0[iii]=odebranyZnak0;
iii++;
}
else
{
slowo0[iii]=0; iii=0;
USART0_Transmit_Word(slowo0);
}
} Myślę że kod jest banalny, lecz mimo to zachowuje się przedziwnie.
Jeśli wysyłam: abcde#010
Wtedy odbieram: abcde
Jeśli wysyłam: abcde#010#010
Wtedy odbieram: abcde+puste słowo
Jeśli wysyłam: abcde#010#010
Wtedy odbieram: abcde+puste słowo+puste słowo
Wszystko jest do tej pory ok. Jaja zaczynają się kiedy dam znak #010 (znak nowej linii zapisany dziesiętnie) z przodu.
Jeśli wysyłam: #010abcde#010
Wtedy odbieram: puste słowo+abcde+puste słowo
Tak jest jeszcze ok. A teraz jest najlepsze:
wysyłam: #010#010abcde#010
odbieram: puste słowo+puste słowo+ab (<--- gdzie uciekła reszta znaków?!)
wysyłam: #010#010#010abcde#010
odbieram: puste słowo+puste słowo+puste słowo+ae
wysyłam: #010#010#010#010abcde#010
odbieram: puste słowo+puste słowo+puste słowo+puste słowo+d
wysyłam: #010#010#010#010#010abcde#010
odbieram: puste słowo+puste słowo+puste słowo+puste słowo+c
Im więcej znaków #010 z przodu tym zachowanie programu dziwniejsze. Czy jest na to jakieś wyjaśnienie?
Uart napewno jest dobrze ustawiony. To samo dzieje się niezależnie od prędkości transmisji. efuse=0xFF (czyli kompatybilność z m103 wyłączona). wg. mnie po stronie 'fizycznej' jest wszystko ok. coś jest w programie ale jest on tak prosty że nie moge doszukać się sam błędu.
pomocy!
Dodano po 38 [minuty]:
odkryłem coś bardzo dziwnego. jak dodam linijke sprintf(buf,"%s",slowo0); to znaki są wysyłane normalnie (nic nie ginie) a puste słowa nie są tworzone.
else
{
slowo0[iii]=0; iii=0;
sprintf(buf,"%s",slowo0); // <--- magic?
USART0_Transmit_Word(buf);
}
Kompletnie nic już nie rozumiem..
Dodano po 12 [minuty]:
A jeszcze bardziej magiczne jest to że jak dam zamiast:
USART0_Transmit_Word(buf);
coś takiego:
USART0_Transmit_Word(slowo0);
to efekt jest taki sam. tak jakby sprintf modyfikował wejście a nie tylko wyjście..