>Generell finde ich die Funktion AT91F_Rx_Char() unglücklich geschrieben,
>weil man nicht zwischen einem empfangenen <NUL> und "kein Zeichen
>ausgelesen" unterscheiden kann.
das ist genau das problem. Hab mir grad mal eine for-schleife
geschrieben, die solange nicht verlassen wird bis ein Zeichen ungleich
0x00 ankommt. Und es handelt sich tatsächlich um das 0x01, welches ich
auch erwarte.
>Weitere Probleme können auftreten, weil AT91F_Rx_Char() keine wartende
>Funktion ist
hab mich hier zu sehr vom datenblatt verleiten lassen, indem steht:
"RXRDY - receiver ready: -> wenn 1 => At least one complete character
has been received and US_RHR has not yet been read"
-> ich bräuchte ein Register, welches wirklich nur dann seinen Wert
ändert, wenn neue Daten / ungleich NULL angekommen sind.
>Weitere Probleme können auftreten, weil AT91F_Rx_Char() keine wartende
>Funktion ist. um darauf genauer einzugehen, bräuchte man mehr Einblick
>in den Auswertecode (s.o.)
Im Prinzip ist mein kleiner Code-Abriss oben genau das was ich mache.
1 | void Xmodem_Start(unsigned char *ptr)
|
2 | {
|
3 | unsigned char cn;
|
4 |
|
5 | for(;;)
|
6 | {
|
7 | cn = AT91F_Rx_Char ();
|
8 |
|
9 | if(cn == SOH)
|
10 | break; //SOH angekommen
|
11 | }
|
12 |
|
13 | //nächstes zeichen: paket number
|
14 | cn = AT91F_Rx_Char ();
|
15 |
|
16 | //paket number inverse auslesen
|
17 | cn = AT91F_Rx_Char ();
|
18 |
|
19 | //.... usw
|
20 |
|
21 | //anschließend daten auslesen von xmodem
|
22 | for(i=0; i<128; i++)
|
23 | {
|
24 | *ptr++ = AT91F_Rx_Char ();
|
25 |
|
26 | }
|
27 |
|
28 |
|
29 | //checksum überprüfen
|
30 | }
|
Im Prinzip suche ich jetzt nach einer Möglichkeit um erst die Funktion
AT91F_Rx_Char() aufzurufen, wenn wirklich neue Daten angekommen sind und
keine NULL-Bytes.
Gruß
Bernd