Du kannst hier keine for-Schleife machen
1 | case LESE_BIT:
|
2 |
|
3 | for (i=0; i<8; i++) {
|
4 |
|
5 | if (bit){//((bit<<i)&0x80) {
|
6 | sleep(1);
|
7 | //bit |= (1<<i);
|
8 | printf("1\n");//printf("%d a\n",i);//printf("01");
|
9 | //sleep(1);
|
10 | }
|
11 | else {
|
12 | sleep(1);
|
13 | //bit &= ~(1<<i);
|
14 | printf("0\n");//printf("%d b\n",i);//printf("00");
|
15 | //sleep(1);
|
16 | }
|
17 | }
|
denn du würdest ja 8-mal dasselbe Bit behandeln.
Aber:
Du kannst natürlich mitzählen! Im zu LESE_BIT vorgelagerten Zustand
setzt du dir einen Zähler auf 0 und jedesmal, wenn du in LESE_BIT kommst
(weil dein Timing ja mit sleep gesteuert ist) erhöhst du diesen Zähler.
Ist er bei 8 angelangt, dann hast du alle 8 Bit gelesen.
Also so ungefähr
1 | case VOR_BIT:
|
2 | sleep(1);
|
3 | if(bit){
|
4 | printf("1 -> bleibe oder gehe in UNDEF: ");
|
5 | zustand = UNDEF;
|
6 | }
|
7 | else {
|
8 | printf("0 -> gehe zu LESE_BIT: ");
|
9 | zustand = LESE_BIT;
|
10 | bitZaehler = 0;
|
11 | }
|
12 | break;
|
13 |
|
14 | case LESE_BIT:
|
15 | if(bitZaehler == 8) {
|
16 | printf("alle 8 Bit eines Bytes empfangen -> gehe zu UNDEF: ");
|
17 | zustand = UNDEF;
|
18 | }
|
19 | else {
|
20 | bitZaehler++;
|
21 |
|
22 | if (bit){
|
23 | ....
|
Im übrigen kommen mir in deinem Code etwas zuviele sleep vor. Wenn das
mal gut geht. Die ganze Zustandsmaschine sieht so gesehen nicht richtig
aus, weil du dich nie auf irgendeine Flanke synchronisierst, an der du
dann deine tatsächlichen Zeiten loslaufen lassen könntest. Auch denke
ich, dass ein nicht ganz unwesentlicher Anteil an der Funktionsfähigkeit
deiner Zustandsmaschine darin besteht, dass auch ein printf Zeit
benötigt. So gesehen, beeinflusst dein Messmittel das zu untersuchende
System. Aber das wirst du dann schon noch sehen, wenn die mal alle weg
sind.